From ed75148eb992cce8830ad192fe851d8d38de1508 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Wed, 28 Jun 2023 16:56:10 +0200 Subject: [PATCH 001/173] refactor(spi): migrate Dataverse SPI to Jakarta EE 10 --- .../src/main/java/io/gdcc/spi/export/ExportDataProvider.java | 4 ++-- .../src/main/java/io/gdcc/spi/export/XMLExporter.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/dataverse-spi/src/main/java/io/gdcc/spi/export/ExportDataProvider.java b/modules/dataverse-spi/src/main/java/io/gdcc/spi/export/ExportDataProvider.java index 228992c8288..d039ac39e8f 100644 --- a/modules/dataverse-spi/src/main/java/io/gdcc/spi/export/ExportDataProvider.java +++ b/modules/dataverse-spi/src/main/java/io/gdcc/spi/export/ExportDataProvider.java @@ -3,8 +3,8 @@ import java.io.InputStream; import java.util.Optional; -import javax.json.JsonArray; -import javax.json.JsonObject; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; /** * Provides all the metadata Dataverse has about a given dataset that can then diff --git a/modules/dataverse-spi/src/main/java/io/gdcc/spi/export/XMLExporter.java b/modules/dataverse-spi/src/main/java/io/gdcc/spi/export/XMLExporter.java index 9afe7ba1cfd..3c3fa35c69d 100644 --- a/modules/dataverse-spi/src/main/java/io/gdcc/spi/export/XMLExporter.java +++ b/modules/dataverse-spi/src/main/java/io/gdcc/spi/export/XMLExporter.java @@ -1,6 +1,6 @@ package io.gdcc.spi.export; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MediaType; /** * XML Exporter is an extension of the base Exporter interface that adds the From b51d2fcc3aa536672a69ada481174649c0c9b069 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Wed, 28 Jun 2023 17:05:29 +0200 Subject: [PATCH 002/173] refactor: migrate main app codebase to Jakarta EE 10 --- .../AbstractGlobalIdServiceBean.java | 4 +- .../AlternativePersistentIdentifier.java | 16 ++-- .../harvard/iq/dataverse/ApiTokenPage.java | 10 +-- .../harvard/iq/dataverse/AuxiliaryFile.java | 20 ++--- .../dataverse/AuxiliaryFileServiceBean.java | 26 +++--- .../harvard/iq/dataverse/BannerMessage.java | 14 ++-- .../dataverse/BannerMessageServiceBean.java | 8 +- .../iq/dataverse/BannerMessageText.java | 14 ++-- .../harvard/iq/dataverse/CitationServlet.java | 14 ++-- .../iq/dataverse/ConfigureFragmentBean.java | 8 +- .../dataverse/ControlledVocabAlternate.java | 18 ++--- .../dataverse/ControlledVocabularyValue.java | 20 ++--- .../ControlledVocabularyValueConverter.java | 12 +-- .../ControlledVocabularyValueServiceBean.java | 10 +-- .../harvard/iq/dataverse/CustomQuestion.java | 2 +- .../iq/dataverse/CustomQuestionResponse.java | 4 +- .../iq/dataverse/CustomQuestionValue.java | 2 +- .../dataverse/CustomizationFilesServlet.java | 12 +-- .../dataverse/DOIDataCiteRegisterCache.java | 16 ++-- .../dataverse/DOIDataCiteRegisterService.java | 10 +-- .../iq/dataverse/DOIDataCiteServiceBean.java | 5 +- .../iq/dataverse/DOIEZIdServiceBean.java | 2 +- .../harvard/iq/dataverse/DashboardPage.java | 14 ++-- .../harvard/iq/dataverse/DataCitation.java | 3 +- .../edu/harvard/iq/dataverse/DataFile.java | 8 +- .../iq/dataverse/DataFileCategory.java | 20 ++--- .../DataFileCategoryServiceBean.java | 4 +- .../iq/dataverse/DataFileConverter.java | 12 +-- .../iq/dataverse/DataFileServiceBean.java | 20 ++--- .../edu/harvard/iq/dataverse/DataFileTag.java | 18 ++--- .../edu/harvard/iq/dataverse/DataTable.java | 29 +++---- .../iq/dataverse/DataTagsAPITestingBean.java | 10 +-- .../iq/dataverse/DataTagsContainer.java | 4 +- .../edu/harvard/iq/dataverse/Dataset.java | 32 ++++---- .../iq/dataverse/DatasetConverter.java | 12 +-- .../iq/dataverse/DatasetDistributor.java | 2 +- .../harvard/iq/dataverse/DatasetField.java | 28 +++---- .../dataverse/DatasetFieldCompoundValue.java | 22 +++--- .../iq/dataverse/DatasetFieldConstant.java | 4 +- .../dataverse/DatasetFieldDefaultValue.java | 24 +++--- .../iq/dataverse/DatasetFieldServiceBean.java | 36 ++++----- .../iq/dataverse/DatasetFieldType.java | 4 +- .../iq/dataverse/DatasetFieldValidator.java | 6 +- .../iq/dataverse/DatasetFieldValue.java | 22 +++--- .../dataverse/DatasetFieldValueValidator.java | 5 +- .../iq/dataverse/DatasetLinkingDataverse.java | 26 +++--- .../dataverse/DatasetLinkingServiceBean.java | 14 ++-- .../edu/harvard/iq/dataverse/DatasetLock.java | 31 ++++---- .../edu/harvard/iq/dataverse/DatasetPage.java | 35 ++++---- .../iq/dataverse/DatasetRelMaterial.java | 16 ++-- .../iq/dataverse/DatasetServiceBean.java | 35 ++++---- .../iq/dataverse/DatasetTopicClass.java | 4 +- .../harvard/iq/dataverse/DatasetVersion.java | 62 +++++++-------- .../iq/dataverse/DatasetVersionConverter.java | 12 +-- .../DatasetVersionNoteValidator.java | 4 +- .../dataverse/DatasetVersionServiceBean.java | 34 ++++---- .../iq/dataverse/DatasetVersionUI.java | 18 ++--- .../iq/dataverse/DatasetVersionUser.java | 22 +++--- .../iq/dataverse/DatasetWidgetsPage.java | 8 +- .../edu/harvard/iq/dataverse/Dataverse.java | 46 ++++++----- .../iq/dataverse/DataverseContact.java | 18 ++--- .../iq/dataverse/DataverseConverter.java | 12 +-- .../harvard/iq/dataverse/DataverseFacet.java | 20 ++--- .../dataverse/DataverseFacetServiceBean.java | 10 +-- .../dataverse/DataverseFeaturedDataverse.java | 20 ++--- .../DataverseFieldTypeInputLevel.java | 22 +++--- ...taverseFieldTypeInputLevelServiceBean.java | 14 ++-- .../iq/dataverse/DataverseHeaderFragment.java | 10 +-- .../dataverse/DataverseLinkingDataverse.java | 24 +++--- .../DataverseLinkingServiceBean.java | 16 ++-- .../DataverseMetadataBlockFacet.java | 16 ++-- .../harvard/iq/dataverse/DataversePage.java | 23 +++--- .../DataverseRequestServiceBean.java | 10 +-- .../dataverse/DataverseRoleServiceBean.java | 12 +-- .../iq/dataverse/DataverseServiceBean.java | 24 +++--- .../iq/dataverse/DataverseSession.java | 14 ++-- .../harvard/iq/dataverse/DataverseTheme.java | 20 ++--- .../harvard/iq/dataverse/DefaultValueSet.java | 14 ++-- .../edu/harvard/iq/dataverse/DvObject.java | 3 +- .../iq/dataverse/DvObjectContainer.java | 3 +- .../iq/dataverse/DvObjectServiceBean.java | 24 +++--- .../iq/dataverse/EditDataFilesPageHelper.java | 4 +- .../iq/dataverse/EditDatafilesPage.java | 35 ++++---- .../iq/dataverse/EjbDataverseEngine.java | 27 +++---- .../iq/dataverse/EjbDataverseEngineInner.java | 12 +-- .../edu/harvard/iq/dataverse/Embargo.java | 2 +- .../iq/dataverse/EmbargoServiceBean.java | 12 +-- .../iq/dataverse/ExternalVocabularyValue.java | 14 ++-- .../harvard/iq/dataverse/FacetConverter.java | 12 +-- .../FeaturedDataverseServiceBean.java | 10 +-- .../iq/dataverse/FileAccessRequest.java | 20 ++--- .../dataverse/FileDirectoryNameValidator.java | 4 +- .../harvard/iq/dataverse/FileDownload.java | 24 +++--- .../iq/dataverse/FileDownloadHelper.java | 8 +- .../iq/dataverse/FileDownloadServiceBean.java | 21 +++-- .../harvard/iq/dataverse/FileMetadata.java | 46 +++++------ .../edu/harvard/iq/dataverse/FilePage.java | 31 ++++---- .../iq/dataverse/FileUploadRenderer.java | 4 +- .../ForeignMetadataFieldMapping.java | 7 +- .../ForeignMetadataFormatMapping.java | 22 +++--- .../edu/harvard/iq/dataverse/Guestbook.java | 28 +++---- .../harvard/iq/dataverse/GuestbookPage.java | 14 ++-- .../iq/dataverse/GuestbookResponse.java | 4 +- .../GuestbookResponseServiceBean.java | 22 +++--- .../iq/dataverse/GuestbookResponsesPage.java | 17 ++-- .../iq/dataverse/GuestbookServiceBean.java | 11 ++- .../iq/dataverse/HandlenetServiceBean.java | 4 +- .../iq/dataverse/HarvestingClientsPage.java | 22 +++--- .../dataverse/HarvestingDataverseConfig.java | 20 ++--- .../iq/dataverse/HarvestingSetsPage.java | 23 +++--- .../harvard/iq/dataverse/HomepageServlet.java | 12 +-- .../harvard/iq/dataverse/LinkValidator.java | 14 ++-- .../edu/harvard/iq/dataverse/LoginPage.java | 23 +++--- .../harvard/iq/dataverse/MailServiceBean.java | 30 +++---- .../dataverse/ManageFilePermissionsPage.java | 17 ++-- .../iq/dataverse/ManageGroupsPage.java | 22 +++--- .../iq/dataverse/ManageGuestbooksPage.java | 24 +++--- .../iq/dataverse/ManagePermissionsPage.java | 17 ++-- .../iq/dataverse/ManageTemplatesPage.java | 18 ++--- .../harvard/iq/dataverse/MetadataBlock.java | 30 +++---- .../iq/dataverse/MetadataBlockConverter.java | 12 +-- .../dataverse/MetadataBlockServiceBean.java | 10 +-- .../java/edu/harvard/iq/dataverse/Metric.java | 23 +++--- .../iq/dataverse/NavigationWrapper.java | 12 +-- .../dataverse/PackagePopupFragmentBean.java | 4 +- .../iq/dataverse/PermissionServiceBean.java | 15 ++-- .../iq/dataverse/PermissionsWrapper.java | 8 +- .../iq/dataverse/RoleAssigneeConverter.java | 12 +-- .../iq/dataverse/RoleAssigneeServiceBean.java | 12 +-- .../harvard/iq/dataverse/RoleAssignment.java | 26 +++--- .../iq/dataverse/RolePermissionFragment.java | 18 ++--- .../iq/dataverse/S3PackageImporter.java | 9 +-- .../iq/dataverse/SendFeedbackDialog.java | 20 ++--- .../harvard/iq/dataverse/SettingsWrapper.java | 20 ++--- .../java/edu/harvard/iq/dataverse/Shib.java | 18 ++--- .../harvard/iq/dataverse/SuperUserPage.java | 10 +-- .../edu/harvard/iq/dataverse/Template.java | 42 +++++----- .../iq/dataverse/TemplateConverter.java | 12 +-- .../harvard/iq/dataverse/TemplatePage.java | 12 +-- .../iq/dataverse/TemplateServiceBean.java | 13 ++- .../iq/dataverse/TermsOfUseAndAccess.java | 18 ++--- .../TermsOfUseAndAccessValidator.java | 4 +- .../iq/dataverse/ThemeWidgetFragment.java | 20 ++--- .../iq/dataverse/ThumbnailServiceWrapper.java | 17 ++-- .../iq/dataverse/UserBannerMessage.java | 18 ++--- .../iq/dataverse/UserNotification.java | 22 +++--- .../UserNotificationServiceBean.java | 20 ++--- .../harvard/iq/dataverse/UserServiceBean.java | 16 ++-- .../ValidateDataFileDirectoryName.java | 4 +- .../dataverse/ValidateDatasetFieldType.java | 4 +- .../ValidateTermsOfUseAndAccess.java | 4 +- .../iq/dataverse/ValidateVersionNote.java | 4 +- .../harvard/iq/dataverse/WidgetWrapper.java | 8 +- .../actionlogging/ActionLogRecord.java | 20 ++--- .../actionlogging/ActionLogServiceBean.java | 10 +-- .../iq/dataverse/api/AbstractApiBean.java | 36 ++++----- .../edu/harvard/iq/dataverse/api/Access.java | 79 +++++++++---------- .../edu/harvard/iq/dataverse/api/Admin.java | 55 +++++++------ .../iq/dataverse/api/ApiBlockingFilter.java | 18 ++--- .../iq/dataverse/api/ApiConfiguration.java | 2 +- .../harvard/iq/dataverse/api/ApiRouter.java | 16 ++-- .../harvard/iq/dataverse/api/BatchImport.java | 20 ++--- .../iq/dataverse/api/BatchServiceBean.java | 12 +-- .../iq/dataverse/api/BuiltinUsers.java | 25 +++--- .../api/BundleDownloadInstanceWriter.java | 16 ++-- .../harvard/iq/dataverse/api/DataTagsAPI.java | 24 +++--- .../dataverse/api/DatasetFieldServiceApi.java | 30 +++---- .../harvard/iq/dataverse/api/Datasets.java | 51 ++++++------ .../harvard/iq/dataverse/api/Dataverses.java | 69 ++++++++-------- .../iq/dataverse/api/DownloadInstance.java | 6 +- .../dataverse/api/DownloadInstanceWriter.java | 24 +++--- .../edu/harvard/iq/dataverse/api/EditDDI.java | 37 ++++----- .../iq/dataverse/api/ExternalTools.java | 18 ++--- .../harvard/iq/dataverse/api/FeedbackApi.java | 22 +++--- .../edu/harvard/iq/dataverse/api/Files.java | 42 +++++----- .../edu/harvard/iq/dataverse/api/Groups.java | 28 +++---- .../iq/dataverse/api/HarvestingClients.java | 31 ++++---- .../iq/dataverse/api/HarvestingServer.java | 34 ++++---- .../edu/harvard/iq/dataverse/api/Index.java | 36 ++++----- .../edu/harvard/iq/dataverse/api/Info.java | 16 ++-- .../harvard/iq/dataverse/api/LDNInbox.java | 28 +++---- .../harvard/iq/dataverse/api/Licenses.java | 26 +++--- .../edu/harvard/iq/dataverse/api/Logout.java | 8 +- .../edu/harvard/iq/dataverse/api/Mail.java | 8 +- .../iq/dataverse/api/MakeDataCountApi.java | 26 +++--- .../edu/harvard/iq/dataverse/api/Meta.java | 22 +++--- .../harvard/iq/dataverse/api/Metadata.java | 17 ++-- .../iq/dataverse/api/MetadataBlocks.java | 10 +-- .../edu/harvard/iq/dataverse/api/Metrics.java | 32 ++++---- .../iq/dataverse/api/Notifications.java | 26 +++--- .../edu/harvard/iq/dataverse/api/Pids.java | 36 ++++----- .../edu/harvard/iq/dataverse/api/Prov.java | 34 ++++---- .../edu/harvard/iq/dataverse/api/Roles.java | 23 +++--- .../iq/dataverse/api/SavedSearches.java | 34 ++++---- .../edu/harvard/iq/dataverse/api/Search.java | 23 +++--- .../edu/harvard/iq/dataverse/api/SiteMap.java | 14 ++-- .../iq/dataverse/api/StorageSites.java | 20 ++--- .../edu/harvard/iq/dataverse/api/TestApi.java | 19 +++-- .../harvard/iq/dataverse/api/TestIngest.java | 20 ++--- .../edu/harvard/iq/dataverse/api/Users.java | 36 ++++----- .../edu/harvard/iq/dataverse/api/Util.java | 6 +- .../harvard/iq/dataverse/api/Workflows.java | 10 +-- .../iq/dataverse/api/WorkflowsAdmin.java | 24 +++--- .../api/auth/ApiKeyAuthMechanism.java | 4 +- .../iq/dataverse/api/auth/AuthFilter.java | 12 +-- .../iq/dataverse/api/auth/AuthMechanism.java | 2 +- .../iq/dataverse/api/auth/AuthRequired.java | 2 +- .../api/auth/BearerTokenAuthMechanism.java | 6 +- .../api/auth/CompoundAuthMechanism.java | 4 +- .../api/auth/SessionCookieAuthMechanism.java | 4 +- .../api/auth/SignedUrlAuthMechanism.java | 6 +- .../api/auth/WorkflowKeyAuthMechanism.java | 4 +- .../api/auth/WrappedAuthErrorResponse.java | 4 +- .../api/batchjob/BatchJobResource.java | 22 +++--- .../api/batchjob/FileRecordJobResource.java | 28 +++---- .../CollectionDepositManagerImpl.java | 12 +-- .../CollectionListManagerImpl.java | 6 +- .../api/datadeposit/ContainerManagerImpl.java | 12 +-- .../datadeposit/MediaResourceManagerImpl.java | 15 ++-- .../datadeposit/SWORDv2CollectionServlet.java | 8 +- .../datadeposit/SWORDv2ContainerServlet.java | 8 +- .../SWORDv2MediaResourceServlet.java | 8 +- .../SWORDv2ServiceDocumentServlet.java | 8 +- .../datadeposit/SWORDv2StatementServlet.java | 8 +- .../ServiceDocumentManagerImpl.java | 4 +- .../api/datadeposit/StatementManagerImpl.java | 6 +- .../datadeposit/SwordConfigurationImpl.java | 2 +- .../api/datadeposit/SwordServiceBean.java | 8 +- .../ConstraintViolationExceptionHandler.java | 22 +++--- .../JsonParseExceptionHandler.java | 19 ++--- .../api/errorhandlers/ThrowableHandler.java | 10 +-- .../WebApplicationExceptionHandler.java | 12 +-- .../dataverse/api/imports/CustomFieldMap.java | 16 ++-- .../api/imports/CustomFieldServiceBean.java | 6 +- .../api/imports/ImportDDIServiceBean.java | 7 +- .../api/imports/ImportGenericServiceBean.java | 21 +++-- .../api/imports/ImportServiceBean.java | 34 ++++---- .../api/util/JsonResponseBuilder.java | 16 ++-- .../dataverse/authorization/AuthFilter.java | 16 ++-- .../AuthTestDataServiceBean.java | 2 +- .../AuthenticatedUserLookup.java | 22 +++--- ...ationProvidersRegistrationServiceBean.java | 18 ++--- .../AuthenticationServiceBean.java | 39 ++++----- .../authorization/DataverseRole.java | 26 +++--- .../DataverseRolePermissionHelper.java | 12 +-- .../groups/GroupServiceBean.java | 10 +-- .../groups/impl/PersistedGlobalGroup.java | 16 ++-- .../groups/impl/explicit/ExplicitGroup.java | 36 ++++----- .../explicit/ExplicitGroupServiceBean.java | 15 ++-- .../groups/impl/ipaddress/IpGroup.java | 12 +-- .../impl/ipaddress/IpGroupsServiceBean.java | 12 +-- .../groups/impl/ipaddress/ip/IPv4Range.java | 14 ++-- .../groups/impl/ipaddress/ip/IPv6Range.java | 14 ++-- .../impl/ipaddress/ip/IpAddressRange.java | 4 +- .../impl/maildomain/MailDomainGroup.java | 10 +-- .../MailDomainGroupServiceBean.java | 16 ++-- .../groups/impl/shib/ShibGroup.java | 13 ++- .../impl/shib/ShibGroupServiceBean.java | 16 ++-- .../providers/AuthenticationProviderRow.java | 14 ++-- .../providers/builtin/BuiltinUser.java | 28 +++---- .../builtin/BuiltinUserServiceBean.java | 24 +++--- .../providers/builtin/DataverseUserPage.java | 18 ++--- .../AbstractOAuth2AuthenticationProvider.java | 2 +- .../oauth2/OAuth2FirstLoginPage.java | 16 ++-- .../oauth2/OAuth2LoginBackingBean.java | 12 +-- .../providers/oauth2/OAuth2TokenData.java | 16 ++-- .../oauth2/OAuth2TokenDataServiceBean.java | 8 +- .../providers/oauth2/impl/GitHubOAuth2AP.java | 6 +- .../providers/oauth2/impl/GoogleOAuth2AP.java | 6 +- .../oauth2/impl/MicrosoftOAuth2AP.java | 6 +- .../providers/oauth2/impl/OrcidOAuth2AP.java | 8 +- .../providers/shib/ShibServiceBean.java | 16 ++-- .../providers/shib/ShibUtil.java | 2 +- .../authorization/users/ApiToken.java | 24 +++--- .../users/AuthenticatedUser.java | 32 ++++---- .../batch/entities/JobExecutionEntity.java | 10 +-- .../batch/entities/StepExecutionEntity.java | 6 +- .../filesystem/FileRecordJobListener.java | 36 ++++----- .../filesystem/FileRecordProcessor.java | 18 ++--- .../importer/filesystem/FileRecordReader.java | 22 +++--- .../importer/filesystem/FileRecordWriter.java | 24 +++--- .../iq/dataverse/batch/util/LoggingUtil.java | 2 +- .../iq/dataverse/branding/BrandingUtil.java | 2 +- .../branding/BrandingUtilHelper.java | 8 +- .../confirmemail/ConfirmEmailData.java | 22 +++--- .../confirmemail/ConfirmEmailPage.java | 8 +- .../confirmemail/ConfirmEmailServiceBean.java | 15 ++-- .../dashboard/DashboardDatamovePage.java | 21 +++-- .../dashboard/DashboardUsersPage.java | 8 +- .../iq/dataverse/dataaccess/S3AccessIO.java | 6 +- .../DataCaptureModuleServiceBean.java | 4 +- .../DataCaptureModuleUtil.java | 6 +- .../datasetutility/AddReplaceFileHelper.java | 29 ++++--- .../datavariable/CategoryMetadata.java | 16 ++-- .../dataverse/datavariable/DataVariable.java | 24 +++--- .../datavariable/SummaryStatistic.java | 16 ++-- .../iq/dataverse/datavariable/VarGroup.java | 18 ++--- .../datavariable/VariableCategory.java | 16 ++-- .../datavariable/VariableMetadata.java | 24 +++--- .../dataverse/datavariable/VariableRange.java | 16 ++-- .../datavariable/VariableRangeItem.java | 16 ++-- .../datavariable/VariableServiceBean.java | 12 +-- .../iq/dataverse/dataverse/DataverseUtil.java | 2 +- .../engine/command/CommandContext.java | 2 +- .../engine/command/DataverseRequest.java | 3 +- .../command/impl/AbstractDatasetCommand.java | 2 +- ...ddRoleAssigneesToExplicitGroupCommand.java | 2 +- .../impl/ChangeUserIdentifierCommand.java | 10 +-- .../command/impl/CreateRoleCommand.java | 3 +- .../impl/CreateSavedSearchCommand.java | 2 +- .../impl/DRSSubmitToArchiveCommand.java | 8 +- .../impl/DuraCloudSubmitToArchiveCommand.java | 4 +- .../FinalizeDatasetPublicationCommand.java | 4 +- .../command/impl/GetProvJsonCommand.java | 6 +- .../command/impl/GetUserTracesCommand.java | 8 +- .../GoogleCloudSubmitToArchiveCommand.java | 4 +- .../impl/ImportFromFileSystemCommand.java | 12 +-- .../command/impl/LinkDataverseCommand.java | 4 +- .../impl/LocalSubmitToArchiveCommand.java | 4 +- .../command/impl/RedetectFileTypeCommand.java | 2 +- .../impl/S3SubmitToArchiveCommand.java | 6 +- .../command/impl/UningestFileCommand.java | 4 +- .../impl/UpdateDatasetVersionCommand.java | 2 +- .../command/impl/UpdateDataverseCommand.java | 9 +-- .../iq/dataverse/export/DCTermsExporter.java | 2 +- .../export/DDIExportServiceBean.java | 16 ++-- .../iq/dataverse/export/DDIExporter.java | 3 +- .../dataverse/export/DublinCoreExporter.java | 3 +- .../iq/dataverse/export/ExportService.java | 3 +- .../export/HtmlCodeBookExporter.java | 9 +-- .../export/InternalExportDataProvider.java | 10 +-- .../iq/dataverse/export/JSONExporter.java | 5 +- .../iq/dataverse/export/OAI_DDIExporter.java | 3 +- .../iq/dataverse/export/OAI_OREExporter.java | 9 +-- .../iq/dataverse/export/OpenAireExporter.java | 3 +- .../export/SchemaDotOrgExporter.java | 2 +- .../dataverse/export/ddi/DdiExportUtil.java | 34 ++------ .../export/ddi/DdiExportUtilHelper.java | 8 +- .../dublincore/DublinCoreExportUtil.java | 6 +- .../export/openaire/OpenAireExportUtil.java | 7 +- .../dataverse/externaltools/ExternalTool.java | 28 +++---- .../externaltools/ExternalToolHandler.java | 18 ++--- .../ExternalToolServiceBean.java | 33 ++++---- .../externaltools/ExternalToolType.java | 24 +++--- .../iq/dataverse/feedback/Feedback.java | 4 +- .../iq/dataverse/feedback/FeedbackUtil.java | 4 +- .../flyway/StartupFlywayMigrator.java | 12 +-- .../dataverse/globus/GlobusServiceBean.java | 26 +++--- .../harvest/client/ClientHarvestRun.java | 16 ++-- .../harvest/client/HarvesterServiceBean.java | 20 ++--- .../harvest/client/HarvestingClient.java | 38 ++++----- .../client/HarvestingClientServiceBean.java | 24 +++--- .../dataverse/harvest/server/OAIRecord.java | 12 +-- .../harvest/server/OAIRecordServiceBean.java | 25 +++--- .../iq/dataverse/harvest/server/OAISet.java | 20 ++--- .../harvest/server/OAISetServiceBean.java | 18 ++--- .../server/web/servlet/OAIServlet.java | 17 ++-- .../dataverse/ingest/IngestMessageBean.java | 18 ++--- .../dataverse/ingest/IngestQueueProducer.java | 14 ++-- .../iq/dataverse/ingest/IngestReport.java | 22 +++--- .../iq/dataverse/ingest/IngestRequest.java | 20 ++--- .../dataverse/ingest/IngestServiceBean.java | 28 +++---- .../iq/dataverse/ingest/IngestUtil.java | 9 +-- .../impl/plugins/rdata/RDATAFileReader.java | 10 +-- .../harvard/iq/dataverse/license/License.java | 20 ++--- .../dataverse/license/LicenseConverter.java | 10 +-- .../dataverse/license/LicenseServiceBean.java | 14 ++-- .../locality/DvObjectStorageLocation.java | 10 +-- .../iq/dataverse/locality/StorageSite.java | 14 ++-- .../locality/StorageSiteServiceBean.java | 12 +-- .../dataverse/locality/StorageSiteUtil.java | 2 +- .../DatasetExternalCitations.java | 16 ++-- .../DatasetExternalCitationsServiceBean.java | 20 ++--- .../makedatacount/DatasetMetrics.java | 18 ++--- .../DatasetMetricsServiceBean.java | 27 +++---- .../MakeDataCountLoggingServiceBean.java | 16 ++-- .../makedatacount/MakeDataCountUtil.java | 9 +-- .../ForeignMetadataImportServiceBean.java | 15 ++-- .../dataverse/metrics/MetricsServiceBean.java | 35 ++++---- .../iq/dataverse/metrics/MetricsUtil.java | 16 ++-- .../iq/dataverse/mydata/DataRetrieverAPI.java | 28 +++---- .../dataverse/mydata/MyDataFilterParams.java | 6 +- .../iq/dataverse/mydata/MyDataFinder.java | 6 +- .../iq/dataverse/mydata/MyDataPage.java | 12 +-- .../harvard/iq/dataverse/mydata/Pager.java | 6 +- .../mydata/RolePermissionHelperPage.java | 9 +-- .../iq/dataverse/mydata/RoleTagRetriever.java | 5 +- .../passwordreset/PasswordResetData.java | 26 +++--- .../passwordreset/PasswordResetPage.java | 16 ++-- .../PasswordResetServiceBean.java | 17 ++-- .../FakePidProviderServiceBean.java | 4 +- .../PermaLinkPidProviderServiceBean.java | 8 +- .../iq/dataverse/pidproviders/PidHelper.java | 8 +- .../iq/dataverse/pidproviders/PidUtil.java | 14 ++-- .../pidproviders/UnmanagedDOIServiceBean.java | 5 +- .../UnmanagedHandlenetServiceBean.java | 2 +- .../dataverse/privateurl/PrivateUrlPage.java | 8 +- .../privateurl/PrivateUrlServiceBean.java | 16 ++-- .../ProvEntityFileDataConverter.java | 12 +-- .../provenance/ProvInvestigator.java | 4 +- .../provenance/ProvPopupFragmentBean.java | 16 ++-- ...RepositoryStorageAbstractionLayerPage.java | 8 +- ...RepositoryStorageAbstractionLayerUtil.java | 10 +-- .../dataverse/search/AdvancedSearchPage.java | 14 ++-- .../iq/dataverse/search/FacetLabel.java | 2 +- .../iq/dataverse/search/Highlight.java | 2 +- .../iq/dataverse/search/IndexAsync.java | 6 +- .../search/IndexBatchServiceBean.java | 25 +++--- .../iq/dataverse/search/IndexServiceBean.java | 28 +++---- .../search/SearchFilesServiceBean.java | 10 +-- .../search/SearchIncludeFragment.java | 14 ++-- .../search/SearchPermissionsServiceBean.java | 6 +- .../dataverse/search/SearchServiceBean.java | 13 ++- .../dataverse/search/SolrClientService.java | 10 +-- .../search/SolrIndexServiceBean.java | 10 +-- .../dataverse/search/SolrQueryResponse.java | 4 +- .../iq/dataverse/search/SolrSearchResult.java | 8 +- .../search/savedsearch/SavedSearch.java | 20 ++--- .../savedsearch/SavedSearchFilterQuery.java | 20 ++--- .../savedsearch/SavedSearchServiceBean.java | 27 +++---- .../iq/dataverse/settings/Setting.java | 14 ++-- .../settings/SettingsServiceBean.java | 20 ++--- .../dataverse/sitemap/SiteMapServiceBean.java | 4 +- .../timer/DataverseTimerServiceBean.java | 26 +++--- .../iq/dataverse/userdata/UserListResult.java | 9 +-- .../harvard/iq/dataverse/util/BundleUtil.java | 2 +- .../harvard/iq/dataverse/util/ClockUtil.java | 6 +- .../util/ConstraintViolationUtil.java | 4 +- .../iq/dataverse/util/DataSourceProducer.java | 8 +- .../iq/dataverse/util/DatasetFieldWalker.java | 7 +- .../harvard/iq/dataverse/util/EjbUtil.java | 2 +- .../harvard/iq/dataverse/util/FileUtil.java | 12 ++- .../harvard/iq/dataverse/util/JsfHelper.java | 6 +- .../harvard/iq/dataverse/util/MailUtil.java | 4 +- .../iq/dataverse/util/PersonOrOrgUtil.java | 8 +- .../util/RequiredCheckboxValidator.java | 12 +-- .../iq/dataverse/util/SessionUtil.java | 4 +- .../dataverse/util/SignpostingResources.java | 6 +- .../iq/dataverse/util/SystemConfig.java | 18 ++--- .../iq/dataverse/util/URLTokenUtil.java | 4 +- .../iq/dataverse/util/WebloaderUtil.java | 14 +--- .../iq/dataverse/util/bagit/BagGenerator.java | 2 +- .../iq/dataverse/util/bagit/OREMap.java | 12 +-- .../iq/dataverse/util/bagit/OREMapHelper.java | 8 +- .../util/file/BagItFileHandlerFactory.java | 8 +- .../dataverse/util/json/BriefJsonPrinter.java | 3 +- .../iq/dataverse/util/json/JSONLDUtil.java | 22 +++--- .../iq/dataverse/util/json/JsonParser.java | 14 ++-- .../iq/dataverse/util/json/JsonPrinter.java | 19 ++--- .../util/json/JsonPrinterHelper.java | 8 +- .../iq/dataverse/util/json/JsonUtil.java | 16 ++-- .../util/json/NullSafeJsonBuilder.java | 10 +-- .../dataverse/validation/EMailValidator.java | 4 +- .../PasswordValidatorServiceBean.java | 6 +- .../iq/dataverse/validation/URLValidator.java | 5 +- .../dataverse/validation/ValidateEmail.java | 4 +- .../iq/dataverse/validation/ValidateURL.java | 4 +- .../validation/ValidateUserName.java | 10 +-- .../workflow/PendingWorkflowInvocation.java | 16 ++-- .../iq/dataverse/workflow/Workflow.java | 20 ++--- .../workflow/WorkflowServiceBean.java | 19 +++-- .../ArchivalSubmissionWorkflowStep.java | 4 +- .../internalspi/AuthorizedExternalStep.java | 9 +-- .../LDNAnnounceDatasetVersionStep.java | 12 +-- .../workflow/step/WorkflowStepData.java | 16 ++-- .../dataverse/workflows/WorkflowComment.java | 16 ++-- .../iq/dataverse/workflows/WorkflowUtil.java | 7 +- .../batch-jobs/FileSystemImportJob.xml | 4 +- 468 files changed, 3329 insertions(+), 3591 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/AbstractGlobalIdServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/AbstractGlobalIdServiceBean.java index 479438f3f45..1de5d1b5ce2 100644 --- a/src/main/java/edu/harvard/iq/dataverse/AbstractGlobalIdServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/AbstractGlobalIdServiceBean.java @@ -3,8 +3,8 @@ import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import edu.harvard.iq.dataverse.util.SystemConfig; import java.io.InputStream; -import javax.ejb.EJB; -import javax.inject.Inject; +import jakarta.ejb.EJB; +import jakarta.inject.Inject; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; diff --git a/src/main/java/edu/harvard/iq/dataverse/AlternativePersistentIdentifier.java b/src/main/java/edu/harvard/iq/dataverse/AlternativePersistentIdentifier.java index 6fc7262925a..db3c6029a78 100644 --- a/src/main/java/edu/harvard/iq/dataverse/AlternativePersistentIdentifier.java +++ b/src/main/java/edu/harvard/iq/dataverse/AlternativePersistentIdentifier.java @@ -3,14 +3,14 @@ import java.io.Serializable; 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.ManyToOne; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; +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.Temporal; +import jakarta.persistence.TemporalType; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/ApiTokenPage.java b/src/main/java/edu/harvard/iq/dataverse/ApiTokenPage.java index 4838847e400..16ff4d266d8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ApiTokenPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/ApiTokenPage.java @@ -5,14 +5,14 @@ import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.util.BundleUtil; import edu.harvard.iq.dataverse.api.Util; -import java.sql.Timestamp; + import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.ejb.EJB; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; /** * @todo Rename this to ApiTokenFragment? The separate page is being taken out diff --git a/src/main/java/edu/harvard/iq/dataverse/AuxiliaryFile.java b/src/main/java/edu/harvard/iq/dataverse/AuxiliaryFile.java index 344032ef5e3..d03ebbc6f7b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/AuxiliaryFile.java +++ b/src/main/java/edu/harvard/iq/dataverse/AuxiliaryFile.java @@ -4,16 +4,16 @@ import edu.harvard.iq.dataverse.util.BundleUtil; import java.io.Serializable; import java.util.MissingResourceException; -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.NamedNativeQueries; -import javax.persistence.NamedNativeQuery; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; +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.NamedNativeQueries; +import jakarta.persistence.NamedNativeQuery; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/AuxiliaryFileServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/AuxiliaryFileServiceBean.java index 05f3e209632..8c96f98ce39 100644 --- a/src/main/java/edu/harvard/iq/dataverse/AuxiliaryFileServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/AuxiliaryFileServiceBean.java @@ -14,19 +14,19 @@ import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import javax.persistence.TypedQuery; -import javax.ws.rs.ClientErrorException; -import javax.ws.rs.InternalServerErrorException; -import javax.ws.rs.ServerErrorException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.NoResultException; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; +import jakarta.ws.rs.ClientErrorException; +import jakarta.ws.rs.InternalServerErrorException; +import jakarta.ws.rs.ServerErrorException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import org.apache.tika.Tika; diff --git a/src/main/java/edu/harvard/iq/dataverse/BannerMessage.java b/src/main/java/edu/harvard/iq/dataverse/BannerMessage.java index 4f465168580..214e26965fa 100644 --- a/src/main/java/edu/harvard/iq/dataverse/BannerMessage.java +++ b/src/main/java/edu/harvard/iq/dataverse/BannerMessage.java @@ -4,13 +4,13 @@ import edu.harvard.iq.dataverse.util.BundleUtil; import java.io.Serializable; import java.util.Collection; -import javax.persistence.CascadeType; -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 jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/BannerMessageServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/BannerMessageServiceBean.java index 91b4128c545..0e757998d58 100644 --- a/src/main/java/edu/harvard/iq/dataverse/BannerMessageServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/BannerMessageServiceBean.java @@ -10,10 +10,10 @@ import java.util.Date; import java.util.List; import java.util.logging.Logger; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/BannerMessageText.java b/src/main/java/edu/harvard/iq/dataverse/BannerMessageText.java index dbae9a6dc27..ea2dd1b41fc 100644 --- a/src/main/java/edu/harvard/iq/dataverse/BannerMessageText.java +++ b/src/main/java/edu/harvard/iq/dataverse/BannerMessageText.java @@ -6,13 +6,13 @@ package edu.harvard.iq.dataverse; import java.io.Serializable; -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 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; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/CitationServlet.java b/src/main/java/edu/harvard/iq/dataverse/CitationServlet.java index f6b4e3dc99a..68c8d49ad7e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/CitationServlet.java +++ b/src/main/java/edu/harvard/iq/dataverse/CitationServlet.java @@ -6,14 +6,14 @@ package edu.harvard.iq.dataverse; import edu.harvard.iq.dataverse.pidproviders.PidUtil; -import edu.harvard.iq.dataverse.util.StringUtil; + import java.io.IOException; -import java.io.PrintWriter; -import javax.ejb.EJB; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; + +import jakarta.ejb.EJB; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/ConfigureFragmentBean.java b/src/main/java/edu/harvard/iq/dataverse/ConfigureFragmentBean.java index d51a73fd2dc..bf509c33995 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ConfigureFragmentBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/ConfigureFragmentBean.java @@ -16,10 +16,10 @@ import java.sql.Timestamp; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.ejb.EJB; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; import java.util.Date; diff --git a/src/main/java/edu/harvard/iq/dataverse/ControlledVocabAlternate.java b/src/main/java/edu/harvard/iq/dataverse/ControlledVocabAlternate.java index 5d5d9597746..9542cfe3f71 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ControlledVocabAlternate.java +++ b/src/main/java/edu/harvard/iq/dataverse/ControlledVocabAlternate.java @@ -7,15 +7,15 @@ import java.io.Serializable; 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.Index; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -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.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/ControlledVocabularyValue.java b/src/main/java/edu/harvard/iq/dataverse/ControlledVocabularyValue.java index 181d939f4a1..5dcce98a90f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ControlledVocabularyValue.java +++ b/src/main/java/edu/harvard/iq/dataverse/ControlledVocabularyValue.java @@ -17,16 +17,16 @@ import java.util.Objects; import java.util.logging.Logger; import java.util.MissingResourceException; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.Table; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/ControlledVocabularyValueConverter.java b/src/main/java/edu/harvard/iq/dataverse/ControlledVocabularyValueConverter.java index 1d530e136ba..eadc13721b3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ControlledVocabularyValueConverter.java +++ b/src/main/java/edu/harvard/iq/dataverse/ControlledVocabularyValueConverter.java @@ -5,13 +5,13 @@ */ package edu.harvard.iq.dataverse; -import javax.ejb.EJB; -import javax.enterprise.inject.spi.CDI; +import jakarta.ejb.EJB; +import jakarta.enterprise.inject.spi.CDI; -import javax.faces.component.UIComponent; -import javax.faces.context.FacesContext; -import javax.faces.convert.Converter; -import javax.faces.convert.FacesConverter; +import jakarta.faces.component.UIComponent; +import jakarta.faces.context.FacesContext; +import jakarta.faces.convert.Converter; +import jakarta.faces.convert.FacesConverter; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/ControlledVocabularyValueServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/ControlledVocabularyValueServiceBean.java index 0e9501414d0..4255c3b2dbc 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ControlledVocabularyValueServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/ControlledVocabularyValueServiceBean.java @@ -6,11 +6,11 @@ package edu.harvard.iq.dataverse; import java.util.List; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.TypedQuery; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.TypedQuery; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/CustomQuestion.java b/src/main/java/edu/harvard/iq/dataverse/CustomQuestion.java index 64723fff79a..2cb6f27c3e4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/CustomQuestion.java +++ b/src/main/java/edu/harvard/iq/dataverse/CustomQuestion.java @@ -1,7 +1,7 @@ package edu.harvard.iq.dataverse; import java.io.Serializable; import java.util.List; -import javax.persistence.*; +import jakarta.persistence.*; import org.hibernate.validator.constraints.NotBlank; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/CustomQuestionResponse.java b/src/main/java/edu/harvard/iq/dataverse/CustomQuestionResponse.java index 32af06014a7..f19ee3c3fc7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/CustomQuestionResponse.java +++ b/src/main/java/edu/harvard/iq/dataverse/CustomQuestionResponse.java @@ -7,8 +7,8 @@ import java.io.Serializable; import java.util.List; -import javax.faces.model.SelectItem; -import javax.persistence.*; +import jakarta.faces.model.SelectItem; +import jakarta.persistence.*; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/CustomQuestionValue.java b/src/main/java/edu/harvard/iq/dataverse/CustomQuestionValue.java index a5329c8b96d..f3a6b83b53f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/CustomQuestionValue.java +++ b/src/main/java/edu/harvard/iq/dataverse/CustomQuestionValue.java @@ -1,7 +1,7 @@ package edu.harvard.iq.dataverse; import java.io.Serializable; -import javax.persistence.*; +import jakarta.persistence.*; import org.hibernate.validator.constraints.NotBlank; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/CustomizationFilesServlet.java b/src/main/java/edu/harvard/iq/dataverse/CustomizationFilesServlet.java index 713d365ba0f..9dd524127d7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/CustomizationFilesServlet.java +++ b/src/main/java/edu/harvard/iq/dataverse/CustomizationFilesServlet.java @@ -14,13 +14,13 @@ import java.io.PrintWriter; import java.nio.file.Path; import java.nio.file.Paths; -import javax.servlet.ServletException; -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; -import javax.ejb.EJB; +import jakarta.ejb.EJB; import org.apache.commons.io.IOUtils; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/DOIDataCiteRegisterCache.java b/src/main/java/edu/harvard/iq/dataverse/DOIDataCiteRegisterCache.java index 7ccd4adb78f..7c75b1a4da6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DOIDataCiteRegisterCache.java +++ b/src/main/java/edu/harvard/iq/dataverse/DOIDataCiteRegisterCache.java @@ -7,14 +7,14 @@ import java.io.Serializable; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Lob; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Lob; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; import org.hibernate.validator.constraints.NotBlank; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/DOIDataCiteRegisterService.java b/src/main/java/edu/harvard/iq/dataverse/DOIDataCiteRegisterService.java index b748897dafe..9ecc4a3ecc9 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DOIDataCiteRegisterService.java +++ b/src/main/java/edu/harvard/iq/dataverse/DOIDataCiteRegisterService.java @@ -18,11 +18,11 @@ import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.TypedQuery; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.TypedQuery; import edu.harvard.iq.dataverse.settings.JvmSettings; import org.apache.commons.text.StringEscapeUtils; diff --git a/src/main/java/edu/harvard/iq/dataverse/DOIDataCiteServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DOIDataCiteServiceBean.java index c5d4faa0569..812f6995bd9 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DOIDataCiteServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DOIDataCiteServiceBean.java @@ -3,7 +3,6 @@ import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; -import java.util.ArrayList; import java.util.Base64; import java.util.HashMap; import java.util.List; @@ -11,8 +10,8 @@ import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; import edu.harvard.iq.dataverse.settings.JvmSettings; import org.apache.commons.httpclient.HttpException; diff --git a/src/main/java/edu/harvard/iq/dataverse/DOIEZIdServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DOIEZIdServiceBean.java index 5776aca8c8a..b9133bc2a0c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DOIEZIdServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DOIEZIdServiceBean.java @@ -7,7 +7,7 @@ import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.Stateless; +import jakarta.ejb.Stateless; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/DashboardPage.java b/src/main/java/edu/harvard/iq/dataverse/DashboardPage.java index 99c7951c96e..c37c3f52bc7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DashboardPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DashboardPage.java @@ -5,23 +5,21 @@ */ package edu.harvard.iq.dataverse; -import edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean; import edu.harvard.iq.dataverse.harvest.client.HarvestingClient; import edu.harvard.iq.dataverse.harvest.client.HarvestingClientServiceBean; import edu.harvard.iq.dataverse.harvest.server.OAISet; import edu.harvard.iq.dataverse.harvest.server.OAISetServiceBean; -import static edu.harvard.iq.dataverse.util.JsfHelper.JH; import edu.harvard.iq.dataverse.util.BundleUtil; import edu.harvard.iq.dataverse.util.SystemConfig; import java.util.List; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.faces.application.FacesMessage; -import javax.faces.context.FacesContext; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.ejb.EJB; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.context.FacesContext; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/DataCitation.java b/src/main/java/edu/harvard/iq/dataverse/DataCitation.java index 30e03046822..9b4b89db44f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataCitation.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataCitation.java @@ -14,7 +14,6 @@ import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; -import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; @@ -27,7 +26,7 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; -import javax.ejb.EJBException; +import jakarta.ejb.EJBException; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; diff --git a/src/main/java/edu/harvard/iq/dataverse/DataFile.java b/src/main/java/edu/harvard/iq/dataverse/DataFile.java index 4e323496188..0f83ae3c5c8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataFile.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataFile.java @@ -29,10 +29,10 @@ import java.util.Set; import java.util.logging.Logger; import java.util.stream.Collectors; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.persistence.*; -import javax.validation.constraints.Pattern; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.persistence.*; +import jakarta.validation.constraints.Pattern; import org.hibernate.validator.constraints.NotBlank; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/DataFileCategory.java b/src/main/java/edu/harvard/iq/dataverse/DataFileCategory.java index f569a69b13a..f5abe9ac78a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataFileCategory.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataFileCategory.java @@ -10,16 +10,16 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToMany; -import javax.persistence.ManyToOne; -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.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToMany; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/DataFileCategoryServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DataFileCategoryServiceBean.java index 3fa4691a6dd..29dcb22c3ec 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataFileCategoryServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataFileCategoryServiceBean.java @@ -3,8 +3,8 @@ import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import edu.harvard.iq.dataverse.util.BundleUtil; -import javax.ejb.EJB; -import javax.ejb.Stateless; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; diff --git a/src/main/java/edu/harvard/iq/dataverse/DataFileConverter.java b/src/main/java/edu/harvard/iq/dataverse/DataFileConverter.java index 18531f5203d..701e826f12e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataFileConverter.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataFileConverter.java @@ -1,13 +1,13 @@ package edu.harvard.iq.dataverse; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.enterprise.inject.spi.CDI; +import jakarta.ejb.EJB; +import jakarta.enterprise.inject.spi.CDI; -import javax.faces.component.UIComponent; -import javax.faces.context.FacesContext; -import javax.faces.convert.Converter; -import javax.faces.convert.FacesConverter; +import jakarta.faces.component.UIComponent; +import jakarta.faces.context.FacesContext; +import jakarta.faces.convert.Converter; +import jakarta.faces.convert.FacesConverter; @FacesConverter("dataFileConverter") public class DataFileConverter implements Converter { diff --git a/src/main/java/edu/harvard/iq/dataverse/DataFileServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DataFileServiceBean.java index ca69caa9802..9cfdb61ded4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataFileServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataFileServiceBean.java @@ -21,16 +21,16 @@ import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.ejb.TransactionAttribute; -import javax.ejb.TransactionAttributeType; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.ejb.TransactionAttribute; +import jakarta.ejb.TransactionAttributeType; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.NoResultException; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/DataFileTag.java b/src/main/java/edu/harvard/iq/dataverse/DataFileTag.java index 275d47cf1de..f4f66d3c874 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataFileTag.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataFileTag.java @@ -11,15 +11,15 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -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.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; import org.apache.commons.lang3.StringUtils; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/DataTable.java b/src/main/java/edu/harvard/iq/dataverse/DataTable.java index 614e7394583..a17d8c65138 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataTable.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataTable.java @@ -7,26 +7,23 @@ package edu.harvard.iq.dataverse; import java.io.Serializable; -import java.util.ArrayList; import java.util.List; -import javax.persistence.CascadeType; -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.OneToMany; -import javax.validation.constraints.Size; -import javax.persistence.OrderBy; -import org.hibernate.validator.constraints.NotBlank; -import org.hibernate.validator.constraints.URL; +import jakarta.persistence.CascadeType; +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.OneToMany; +import jakarta.validation.constraints.Size; +import jakarta.persistence.OrderBy; import edu.harvard.iq.dataverse.datavariable.DataVariable; import java.util.Objects; -import javax.persistence.Column; -import javax.persistence.Index; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Index; +import jakarta.persistence.Table; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/DataTagsAPITestingBean.java b/src/main/java/edu/harvard/iq/dataverse/DataTagsAPITestingBean.java index 2f987dde82b..713c86190fc 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataTagsAPITestingBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataTagsAPITestingBean.java @@ -5,11 +5,11 @@ import java.io.Serializable; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.enterprise.context.SessionScoped; -import javax.faces.context.FacesContext; -import javax.inject.Named; -import javax.json.JsonObject; +import jakarta.ejb.EJB; +import jakarta.enterprise.context.SessionScoped; +import jakarta.faces.context.FacesContext; +import jakarta.inject.Named; +import jakarta.json.JsonObject; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/DataTagsContainer.java b/src/main/java/edu/harvard/iq/dataverse/DataTagsContainer.java index 5cf9c623bde..eeda70c1f17 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataTagsContainer.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataTagsContainer.java @@ -1,7 +1,7 @@ package edu.harvard.iq.dataverse; -import javax.ejb.Stateless; -import javax.json.JsonObject; +import jakarta.ejb.Stateless; +import jakarta.json.JsonObject; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/Dataset.java b/src/main/java/edu/harvard/iq/dataverse/Dataset.java index f9c839a0fff..620e66c6c54 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Dataset.java +++ b/src/main/java/edu/harvard/iq/dataverse/Dataset.java @@ -17,22 +17,22 @@ import java.util.List; import java.util.Objects; import java.util.Set; -import javax.persistence.CascadeType; -import javax.persistence.Entity; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.NamedStoredProcedureQuery; -import javax.persistence.OneToMany; -import javax.persistence.OneToOne; -import javax.persistence.OrderBy; -import javax.persistence.ParameterMode; -import javax.persistence.StoredProcedureParameter; -import javax.persistence.Table; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Entity; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.NamedStoredProcedureQuery; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OneToOne; +import jakarta.persistence.OrderBy; +import jakarta.persistence.ParameterMode; +import jakarta.persistence.StoredProcedureParameter; +import jakarta.persistence.Table; +import jakarta.persistence.Temporal; +import jakarta.persistence.TemporalType; import edu.harvard.iq.dataverse.settings.JvmSettings; import edu.harvard.iq.dataverse.util.StringUtil; diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetConverter.java b/src/main/java/edu/harvard/iq/dataverse/DatasetConverter.java index 2d19cf5fe06..b779e084250 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetConverter.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetConverter.java @@ -6,12 +6,12 @@ package edu.harvard.iq.dataverse; -import javax.ejb.EJB; -import javax.enterprise.inject.spi.CDI; -import javax.faces.component.UIComponent; -import javax.faces.context.FacesContext; -import javax.faces.convert.Converter; -import javax.faces.convert.FacesConverter; +import jakarta.ejb.EJB; +import jakarta.enterprise.inject.spi.CDI; +import jakarta.faces.component.UIComponent; +import jakarta.faces.context.FacesContext; +import jakarta.faces.convert.Converter; +import jakarta.faces.convert.FacesConverter; @FacesConverter("datasetConverter") public class DatasetConverter implements Converter { diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetDistributor.java b/src/main/java/edu/harvard/iq/dataverse/DatasetDistributor.java index 00936b9365a..3252b7f0367 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetDistributor.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetDistributor.java @@ -7,7 +7,7 @@ package edu.harvard.iq.dataverse; import java.util.Comparator; -import javax.persistence.Version; +import jakarta.persistence.Version; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetField.java b/src/main/java/edu/harvard/iq/dataverse/DatasetField.java index 31d08f84c02..c836a20893f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetField.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetField.java @@ -19,20 +19,20 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import javax.persistence.CascadeType; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.ManyToMany; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.OrderBy; -import javax.persistence.Table; -import javax.persistence.Transient; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.JoinTable; +import jakarta.persistence.ManyToMany; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OrderBy; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; import org.apache.commons.lang3.StringUtils; @Entity diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldCompoundValue.java b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldCompoundValue.java index 5d83f1e4f8d..c679cd7edad 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldCompoundValue.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldCompoundValue.java @@ -14,17 +14,17 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import javax.persistence.CascadeType; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.OrderBy; -import javax.persistence.Table; -import javax.persistence.Transient; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OrderBy; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldConstant.java b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldConstant.java index e57a2a1538d..1621b80df55 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldConstant.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldConstant.java @@ -6,8 +6,8 @@ package edu.harvard.iq.dataverse; -import javax.enterprise.context.Dependent; -import javax.inject.Named; +import jakarta.enterprise.context.Dependent; +import jakarta.inject.Named; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldDefaultValue.java b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldDefaultValue.java index bad482dbca9..7746099818e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldDefaultValue.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldDefaultValue.java @@ -8,18 +8,18 @@ import java.io.Serializable; import java.util.Collection; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.OrderBy; -import javax.persistence.Table; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OrderBy; +import jakarta.persistence.Table; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java index 89f8c11d076..620d4bf3e09 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java @@ -17,24 +17,24 @@ import java.util.Set; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonArrayBuilder; -import javax.json.JsonException; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.JsonReader; -import javax.json.JsonString; -import javax.json.JsonValue; -import javax.json.JsonValue.ValueType; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.NonUniqueResultException; -import javax.persistence.PersistenceContext; -import javax.persistence.TypedQuery; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonException; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonReader; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; +import jakarta.json.JsonValue.ValueType; +import jakarta.persistence.EntityManager; +import jakarta.persistence.NoResultException; +import jakarta.persistence.NonUniqueResultException; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.TypedQuery; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.httpclient.HttpException; diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldType.java b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldType.java index df126514308..824b486a42d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldType.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldType.java @@ -13,8 +13,8 @@ import java.util.Set; import java.util.TreeMap; import java.util.MissingResourceException; -import javax.faces.model.SelectItem; -import javax.persistence.*; +import jakarta.faces.model.SelectItem; +import jakarta.persistence.*; /** * Defines the meaning and constraints of a metadata field and its values. diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldValidator.java b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldValidator.java index 3ded24d7a59..6d3fda2812d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldValidator.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldValidator.java @@ -5,11 +5,11 @@ */ package edu.harvard.iq.dataverse; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; import edu.harvard.iq.dataverse.util.BundleUtil; -import java.util.Collections; + import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldValue.java b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldValue.java index 2447a6478fd..1064187ccd6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldValue.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldValue.java @@ -10,17 +10,17 @@ import edu.harvard.iq.dataverse.util.MarkupChecker; import java.io.Serializable; import java.util.Comparator; -import java.util.ResourceBundle; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; -import javax.persistence.Transient; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; import org.apache.commons.lang3.StringUtils; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldValueValidator.java b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldValueValidator.java index 132955859ff..b6c21014f04 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldValueValidator.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldValueValidator.java @@ -13,14 +13,13 @@ import java.util.GregorianCalendar; import java.util.logging.Logger; import java.util.regex.Pattern; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; import edu.harvard.iq.dataverse.util.BundleUtil; import edu.harvard.iq.dataverse.validation.EMailValidator; import edu.harvard.iq.dataverse.validation.URLValidator; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.validator.routines.UrlValidator; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetLinkingDataverse.java b/src/main/java/edu/harvard/iq/dataverse/DatasetLinkingDataverse.java index 8f8e9b103c1..dec07a09643 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetLinkingDataverse.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetLinkingDataverse.java @@ -2,19 +2,19 @@ import java.io.Serializable; 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.Index; -import javax.persistence.JoinColumn; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.OneToOne; -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.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; +import jakarta.persistence.Temporal; +import jakarta.persistence.TemporalType; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetLinkingServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DatasetLinkingServiceBean.java index 3789efcd443..9faeab4b3bc 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetLinkingServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetLinkingServiceBean.java @@ -8,12 +8,12 @@ import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; /** * @@ -63,7 +63,7 @@ public DatasetLinkingDataverse findDatasetLinkingDataverse(Long datasetId, Long .setParameter("datasetId", datasetId) .setParameter("linkingDataverseId", linkingDataverseId) .getSingleResult(); - } catch (javax.persistence.NoResultException e) { + } catch (jakarta.persistence.NoResultException e) { logger.fine("no datasetLinkingDataverse found for datasetId " + datasetId + " and linkingDataverseId " + linkingDataverseId); return null; } diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetLock.java b/src/main/java/edu/harvard/iq/dataverse/DatasetLock.java index 7b857545c20..cc0078ecbc5 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetLock.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetLock.java @@ -20,25 +20,24 @@ package edu.harvard.iq.dataverse; -import static edu.harvard.iq.dataverse.DatasetLock.Reason.Workflow; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import java.util.Date; import java.io.Serializable; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import jakarta.persistence.Temporal; +import jakarta.persistence.TemporalType; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java index 3d608153ba3..8be0da40220 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java @@ -58,7 +58,6 @@ import edu.harvard.iq.dataverse.util.StringUtil; import edu.harvard.iq.dataverse.util.SystemConfig; -import edu.harvard.iq.dataverse.util.URLTokenUtil; import edu.harvard.iq.dataverse.util.WebloaderUtil; import edu.harvard.iq.dataverse.validation.URLValidator; import edu.harvard.iq.dataverse.workflows.WorkflowComment; @@ -84,27 +83,27 @@ import java.util.logging.Logger; import java.util.stream.Collectors; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.faces.application.FacesMessage; -import javax.faces.context.FacesContext; -import javax.faces.event.ActionEvent; -import javax.faces.event.ValueChangeEvent; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.context.FacesContext; +import jakarta.faces.event.ActionEvent; +import jakarta.faces.event.ValueChangeEvent; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; import org.apache.commons.lang3.StringUtils; import org.primefaces.event.FileUploadEvent; import org.primefaces.model.file.UploadedFile; -import javax.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolation; import org.apache.commons.httpclient.HttpClient; //import org.primefaces.context.RequestContext; import java.util.Arrays; import java.util.HashSet; -import javax.faces.model.SelectItem; -import javax.faces.validator.ValidatorException; +import jakarta.faces.model.SelectItem; +import jakarta.faces.validator.ValidatorException; import java.util.logging.Level; import edu.harvard.iq.dataverse.engine.command.exception.IllegalCommandException; @@ -125,12 +124,12 @@ import edu.harvard.iq.dataverse.makedatacount.MakeDataCountLoggingServiceBean; import edu.harvard.iq.dataverse.makedatacount.MakeDataCountLoggingServiceBean.MakeDataCountEntry; import java.util.Collections; -import javax.faces.component.UIComponent; -import javax.faces.component.UIInput; +import jakarta.faces.component.UIComponent; +import jakarta.faces.component.UIInput; -import javax.faces.event.AjaxBehaviorEvent; -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletResponse; +import jakarta.faces.event.AjaxBehaviorEvent; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.text.StringEscapeUtils; import org.apache.commons.lang3.mutable.MutableBoolean; diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetRelMaterial.java b/src/main/java/edu/harvard/iq/dataverse/DatasetRelMaterial.java index f432e4f5bbf..53ea62f566a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetRelMaterial.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetRelMaterial.java @@ -6,14 +6,14 @@ package edu.harvard.iq.dataverse; -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.Version; +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.Version; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DatasetServiceBean.java index 305afd2ed30..d8c518e61b1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetServiceBean.java @@ -30,21 +30,20 @@ import java.util.logging.FileHandler; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.Asynchronous; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.ejb.Stateless; -import javax.ejb.TransactionAttribute; -import javax.ejb.TransactionAttributeType; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.LockModeType; -import javax.persistence.NoResultException; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import javax.persistence.StoredProcedureQuery; -import javax.persistence.TypedQuery; -import org.apache.commons.lang3.RandomStringUtils; +import jakarta.ejb.Asynchronous; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.ejb.Stateless; +import jakarta.ejb.TransactionAttribute; +import jakarta.ejb.TransactionAttributeType; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.LockModeType; +import jakarta.persistence.NoResultException; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; +import jakarta.persistence.StoredProcedureQuery; +import jakarta.persistence.TypedQuery; import org.ocpsoft.common.util.Strings; /** @@ -328,7 +327,7 @@ public Dataset findByGlobalId(String globalId) { * in the dataset components, a ConstraintViolationException will be thrown, * which can be further parsed to detect the specific offending values. * @param id the id of the dataset - * @throws javax.validation.ConstraintViolationException + * @throws jakarta.validation.ConstraintViolationException */ @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) @@ -396,7 +395,7 @@ public DatasetVersionUser getDatasetVersionUser(DatasetVersion version, User use query.setParameter("userId", au.getId()); try { return query.getSingleResult(); - } catch (javax.persistence.NoResultException e) { + } catch (jakarta.persistence.NoResultException e) { return null; } } @@ -511,7 +510,7 @@ public List listLocks(DatasetLock.Reason lockType, AuthenticatedUse } try { return query.getResultList(); - } catch (javax.persistence.NoResultException e) { + } catch (jakarta.persistence.NoResultException e) { return null; } } diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetTopicClass.java b/src/main/java/edu/harvard/iq/dataverse/DatasetTopicClass.java index f253e1810a1..91a4ff3cf5a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetTopicClass.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetTopicClass.java @@ -6,8 +6,8 @@ package edu.harvard.iq.dataverse; -import javax.persistence.Column; -import javax.persistence.Version; +import jakarta.persistence.Column; +import jakarta.persistence.Version; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java index 2873d2f2a22..011dee479d6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java @@ -25,37 +25,37 @@ import java.util.logging.Logger; import java.util.stream.Collectors; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.OneToMany; -import javax.persistence.OneToOne; -import javax.persistence.OrderBy; -import javax.persistence.Table; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; -import javax.persistence.Transient; -import javax.persistence.UniqueConstraint; -import javax.persistence.Version; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; -import javax.validation.constraints.Size; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OneToOne; +import jakarta.persistence.OrderBy; +import jakarta.persistence.Table; +import jakarta.persistence.Temporal; +import jakarta.persistence.TemporalType; +import jakarta.persistence.Transient; +import jakarta.persistence.UniqueConstraint; +import jakarta.persistence.Version; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.constraints.Size; import org.apache.commons.lang3.StringUtils; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionConverter.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersionConverter.java index 98f0d707bdc..b670fb18afc 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionConverter.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersionConverter.java @@ -5,12 +5,12 @@ */ package edu.harvard.iq.dataverse; -import javax.ejb.EJB; -import javax.enterprise.inject.spi.CDI; -import javax.faces.component.UIComponent; -import javax.faces.context.FacesContext; -import javax.faces.convert.Converter; -import javax.faces.convert.FacesConverter; +import jakarta.ejb.EJB; +import jakarta.enterprise.inject.spi.CDI; +import jakarta.faces.component.UIComponent; +import jakarta.faces.context.FacesContext; +import jakarta.faces.convert.Converter; +import jakarta.faces.convert.FacesConverter; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionNoteValidator.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersionNoteValidator.java index c086fed3b10..a5ea487a68f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionNoteValidator.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersionNoteValidator.java @@ -6,8 +6,8 @@ package edu.harvard.iq.dataverse; import edu.harvard.iq.dataverse.util.BundleUtil; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java index 9f272ec6877..38bc60b00d6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java @@ -13,7 +13,7 @@ import edu.harvard.iq.dataverse.util.BundleUtil; import edu.harvard.iq.dataverse.util.MarkupChecker; import edu.harvard.iq.dataverse.util.SystemConfig; -import java.io.IOException; + import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; @@ -22,22 +22,20 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; -import java.util.concurrent.Future; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.json.Json; -import javax.json.JsonObjectBuilder; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.apache.commons.lang3.StringUtils; -import org.apache.solr.client.solrj.SolrServerException; - + /** * * @author skraffmiller @@ -181,7 +179,7 @@ public DatasetVersion findByFriendlyVersionNumber(Long datasetId, String friendl query.setParameter("majorVersionNumber", majorVersionNumber); query.setParameter("minorVersionNumber", minorVersionNumber); foundDatasetVersion = (DatasetVersion) query.getSingleResult(); - } catch (javax.persistence.NoResultException e) { + } catch (jakarta.persistence.NoResultException e) { logger.warning("no ds version found: " + datasetId + " " + friendlyVersionNumber); // DO nothing, just return null. } @@ -209,7 +207,7 @@ public DatasetVersion findByFriendlyVersionNumber(Long datasetId, String friendl } } return retVal; - } catch (javax.persistence.NoResultException e) { + } catch (jakarta.persistence.NoResultException e) { logger.warning("no ds version found: " + datasetId + " " + friendlyVersionNumber); // DO nothing, just return null. } @@ -436,7 +434,7 @@ private DatasetVersion getDatasetVersionByQuery(String queryString){ msg("Found: " + ds); return ds; - } catch (javax.persistence.NoResultException e) { + } catch (jakarta.persistence.NoResultException e) { msg("DatasetVersion not found: " + queryString); logger.log(Level.FINE, "DatasetVersion not found: {0}", queryString); return null; @@ -1202,7 +1200,7 @@ public List getUnarchivedDatasetVersions(){ try { List dsl = em.createNamedQuery("DatasetVersion.findUnarchivedReleasedVersion", DatasetVersion.class).getResultList(); return dsl; - } catch (javax.persistence.NoResultException e) { + } catch (jakarta.persistence.NoResultException e) { logger.log(Level.FINE, "No unarchived DatasetVersions found: {0}"); return null; } catch (EJBException e) { diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionUI.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersionUI.java index d09457c86bf..ce7890fdec1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionUI.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersionUI.java @@ -6,25 +6,21 @@ package edu.harvard.iq.dataverse; import edu.harvard.iq.dataverse.util.MarkupChecker; -import edu.harvard.iq.dataverse.util.StringUtil; + import java.io.Serializable; -import java.sql.Timestamp; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Comparator; import java.util.Date; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.TreeMap; -import static java.util.stream.Collectors.toList; -import javax.ejb.EJB; -import javax.faces.view.ViewScoped; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; + +import jakarta.ejb.EJB; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionUser.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersionUser.java index eda62a080f8..e56fad71253 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionUser.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersionUser.java @@ -4,20 +4,20 @@ import edu.harvard.iq.dataverse.authorization.users.User; import java.io.Serializable; import java.sql.Timestamp; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; +import jakarta.persistence.Id; +import jakarta.persistence.Index; -import javax.persistence.JoinColumn; +import jakarta.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.Table; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.Table; /** * Records the last time a {@link User} handled a {@link DatasetVersion}. diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetWidgetsPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetWidgetsPage.java index 9c47a58811a..1dd42903118 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetWidgetsPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetWidgetsPage.java @@ -14,10 +14,10 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.ejb.EJB; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; import org.primefaces.event.FileUploadEvent; import org.primefaces.model.file.UploadedFile; diff --git a/src/main/java/edu/harvard/iq/dataverse/Dataverse.java b/src/main/java/edu/harvard/iq/dataverse/Dataverse.java index 50d5ae09548..682c1dc6744 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Dataverse.java +++ b/src/main/java/edu/harvard/iq/dataverse/Dataverse.java @@ -2,7 +2,6 @@ import edu.harvard.iq.dataverse.harvest.client.HarvestingClient; import edu.harvard.iq.dataverse.authorization.DataverseRole; -import edu.harvard.iq.dataverse.dataaccess.DataAccess; import edu.harvard.iq.dataverse.search.savedsearch.SavedSearch; import edu.harvard.iq.dataverse.util.BundleUtil; import edu.harvard.iq.dataverse.util.SystemConfig; @@ -13,29 +12,28 @@ import java.util.List; import java.util.Objects; import java.util.Set; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.FetchType; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.ManyToMany; -import javax.persistence.ManyToOne; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.OneToMany; -import javax.persistence.OneToOne; -import javax.persistence.OrderBy; -import javax.persistence.Table; -import javax.persistence.Transient; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; -import javax.validation.constraints.Size; - -import org.apache.commons.lang3.StringUtils; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.JoinTable; +import jakarta.persistence.ManyToMany; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OneToOne; +import jakarta.persistence.OrderBy; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; + import org.hibernate.validator.constraints.NotBlank; import org.hibernate.validator.constraints.NotEmpty; diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseContact.java b/src/main/java/edu/harvard/iq/dataverse/DataverseContact.java index 46021ddbc9b..d77767985eb 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseContact.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseContact.java @@ -7,15 +7,15 @@ import java.io.Serializable; 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.Index; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -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.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; import edu.harvard.iq.dataverse.validation.ValidateEmail; import org.hibernate.validator.constraints.NotBlank; diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseConverter.java b/src/main/java/edu/harvard/iq/dataverse/DataverseConverter.java index 7d09c300dde..d802117043b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseConverter.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseConverter.java @@ -6,12 +6,12 @@ package edu.harvard.iq.dataverse; -import javax.ejb.EJB; -import javax.enterprise.inject.spi.CDI; -import javax.faces.component.UIComponent; -import javax.faces.context.FacesContext; -import javax.faces.convert.Converter; -import javax.faces.convert.FacesConverter; +import jakarta.ejb.EJB; +import jakarta.enterprise.inject.spi.CDI; +import jakarta.faces.component.UIComponent; +import jakarta.faces.context.FacesContext; +import jakarta.faces.convert.Converter; +import jakarta.faces.convert.FacesConverter; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseFacet.java b/src/main/java/edu/harvard/iq/dataverse/DataverseFacet.java index bfd465b8f54..768c2308e50 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseFacet.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseFacet.java @@ -8,16 +8,16 @@ import java.io.Serializable; import java.util.Objects; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.Table; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.Table; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseFacetServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DataverseFacetServiceBean.java index 67bf6a820e2..5c77989f6d6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseFacetServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseFacetServiceBean.java @@ -2,11 +2,11 @@ import edu.harvard.iq.dataverse.util.LruCache; import java.util.List; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseFeaturedDataverse.java b/src/main/java/edu/harvard/iq/dataverse/DataverseFeaturedDataverse.java index 662ee74c3bf..39ad6ca9520 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseFeaturedDataverse.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseFeaturedDataverse.java @@ -2,16 +2,16 @@ import java.io.Serializable; import java.util.Objects; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.Table; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.Table; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseFieldTypeInputLevel.java b/src/main/java/edu/harvard/iq/dataverse/DataverseFieldTypeInputLevel.java index 92b1ff7c2cf..c4749be0cb3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseFieldTypeInputLevel.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseFieldTypeInputLevel.java @@ -6,17 +6,17 @@ package edu.harvard.iq.dataverse; import java.io.Serializable; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.Table; -import javax.persistence.UniqueConstraint; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.Table; +import jakarta.persistence.UniqueConstraint; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseFieldTypeInputLevelServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DataverseFieldTypeInputLevelServiceBean.java index 42a1290fdbd..66c700f59ce 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseFieldTypeInputLevelServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseFieldTypeInputLevelServiceBean.java @@ -7,13 +7,13 @@ import edu.harvard.iq.dataverse.util.LruCache; import java.util.List; -import java.util.logging.Logger; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; + +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.NoResultException; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseHeaderFragment.java b/src/main/java/edu/harvard/iq/dataverse/DataverseHeaderFragment.java index 1e1353a11fc..389b85c19d9 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseHeaderFragment.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseHeaderFragment.java @@ -19,11 +19,11 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.faces.context.FacesContext; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.ejb.EJB; +import jakarta.faces.context.FacesContext; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; import org.apache.commons.lang3.StringUtils; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseLinkingDataverse.java b/src/main/java/edu/harvard/iq/dataverse/DataverseLinkingDataverse.java index 788308dce1e..3030922ea5e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseLinkingDataverse.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseLinkingDataverse.java @@ -7,18 +7,18 @@ import java.io.Serializable; import java.util.Date; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.OneToOne; -import javax.persistence.Table; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; +import jakarta.persistence.Temporal; +import jakarta.persistence.TemporalType; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseLinkingServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DataverseLinkingServiceBean.java index c823deddb64..834ff96e392 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseLinkingServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseLinkingServiceBean.java @@ -8,13 +8,13 @@ import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; /** * @@ -66,7 +66,7 @@ public DataverseLinkingDataverse findDataverseLinkingDataverse(Long dataverseId, .setParameter("dataverseId", dataverseId) .setParameter("linkingDataverseId", linkingDataverseId) .getSingleResult(); - } catch (javax.persistence.NoResultException e) { + } catch (jakarta.persistence.NoResultException e) { logger.fine("No DataverseLinkingDataverse found for dataverseId " + dataverseId + " and linkedDataverseId " + linkingDataverseId); return null; } diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseMetadataBlockFacet.java b/src/main/java/edu/harvard/iq/dataverse/DataverseMetadataBlockFacet.java index a2659b81974..c93144b2e97 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseMetadataBlockFacet.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseMetadataBlockFacet.java @@ -1,13 +1,13 @@ package edu.harvard.iq.dataverse; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; import java.io.Serializable; import java.util.Objects; diff --git a/src/main/java/edu/harvard/iq/dataverse/DataversePage.java b/src/main/java/edu/harvard/iq/dataverse/DataversePage.java index b48ff725e1e..daf33f444d9 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataversePage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataversePage.java @@ -28,27 +28,26 @@ import static edu.harvard.iq.dataverse.util.JsfHelper.JH; import edu.harvard.iq.dataverse.util.SystemConfig; import java.util.List; -import javax.ejb.EJB; -import javax.faces.application.FacesMessage; -import javax.faces.context.FacesContext; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.ejb.EJB; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.context.FacesContext; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; -import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; -import javax.faces.component.UIComponent; -import javax.faces.component.UIInput; +import jakarta.faces.component.UIComponent; +import jakarta.faces.component.UIInput; import org.primefaces.model.DualListModel; -import javax.ejb.EJBException; -import javax.faces.event.ValueChangeEvent; -import javax.faces.model.SelectItem; +import jakarta.ejb.EJBException; +import jakarta.faces.event.ValueChangeEvent; +import jakarta.faces.model.SelectItem; import org.apache.commons.text.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; import org.primefaces.PrimeFaces; diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseRequestServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DataverseRequestServiceBean.java index e193b535412..58a3837dbf9 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseRequestServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseRequestServiceBean.java @@ -1,11 +1,11 @@ package edu.harvard.iq.dataverse; import edu.harvard.iq.dataverse.engine.command.DataverseRequest; -import javax.annotation.PostConstruct; -import javax.enterprise.context.RequestScoped; -import javax.inject.Inject; -import javax.inject.Named; -import javax.servlet.http.HttpServletRequest; +import jakarta.annotation.PostConstruct; +import jakarta.enterprise.context.RequestScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.servlet.http.HttpServletRequest; /** * The service bean to go to when one needs the current {@link DataverseRequest}. diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseRoleServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DataverseRoleServiceBean.java index b83593f5b6e..2d9a26a01c8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseRoleServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseRoleServiceBean.java @@ -17,12 +17,12 @@ import java.util.Set; import java.util.logging.Logger; import java.util.stream.Collectors; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.TypedQuery; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.TypedQuery; //import javax.validation.constraints.NotNull; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DataverseServiceBean.java index e092f209acd..7194a1ef31e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseServiceBean.java @@ -30,18 +30,18 @@ import java.util.Map; import java.util.logging.Logger; import java.util.Properties; -import java.util.concurrent.Future; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Inject; -import javax.inject.Named; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.NonUniqueResultException; -import javax.persistence.PersistenceContext; -import javax.persistence.TypedQuery; + +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.persistence.EntityManager; +import jakarta.persistence.NoResultException; +import jakarta.persistence.NonUniqueResultException; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.TypedQuery; import org.apache.solr.client.solrj.SolrServerException; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseSession.java b/src/main/java/edu/harvard/iq/dataverse/DataverseSession.java index c6016939c08..e8d76e1825e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseSession.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseSession.java @@ -18,13 +18,13 @@ import java.util.List; import java.util.Locale; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.enterprise.context.SessionScoped; -import javax.faces.context.FacesContext; -import javax.inject.Inject; -import javax.inject.Named; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; +import jakarta.ejb.EJB; +import jakarta.enterprise.context.SessionScoped; +import jakarta.faces.context.FacesContext; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseTheme.java b/src/main/java/edu/harvard/iq/dataverse/DataverseTheme.java index 0c6341db485..539669328a7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseTheme.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseTheme.java @@ -8,16 +8,16 @@ import java.io.Serializable; import java.util.Objects; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.OneToOne; -import javax.persistence.Table; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/DefaultValueSet.java b/src/main/java/edu/harvard/iq/dataverse/DefaultValueSet.java index ad48f15fc54..a2dc785c470 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DefaultValueSet.java +++ b/src/main/java/edu/harvard/iq/dataverse/DefaultValueSet.java @@ -8,13 +8,13 @@ import java.io.Serializable; import java.util.List; -import javax.persistence.CascadeType; -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 jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/DvObject.java b/src/main/java/edu/harvard/iq/dataverse/DvObject.java index e3013b8cf51..9e7f3f3fe96 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DvObject.java +++ b/src/main/java/edu/harvard/iq/dataverse/DvObject.java @@ -5,14 +5,13 @@ import java.sql.Timestamp; import java.text.SimpleDateFormat; -import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Objects; import java.util.Set; import java.util.logging.Logger; -import javax.persistence.*; +import jakarta.persistence.*; /** * Base of the object hierarchy for "anything that can be inside a dataverse". diff --git a/src/main/java/edu/harvard/iq/dataverse/DvObjectContainer.java b/src/main/java/edu/harvard/iq/dataverse/DvObjectContainer.java index 6ff01ef3ea8..a322a25103e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DvObjectContainer.java +++ b/src/main/java/edu/harvard/iq/dataverse/DvObjectContainer.java @@ -2,8 +2,7 @@ import edu.harvard.iq.dataverse.dataaccess.DataAccess; import edu.harvard.iq.dataverse.util.SystemConfig; -import java.util.Locale; -import javax.persistence.MappedSuperclass; +import jakarta.persistence.MappedSuperclass; import org.apache.commons.lang3.StringUtils; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/DvObjectServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DvObjectServiceBean.java index 3430528aea3..82af3d4bfe1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DvObjectServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DvObjectServiceBean.java @@ -12,16 +12,16 @@ import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.Stateless; -import javax.ejb.TransactionAttribute; -import static javax.ejb.TransactionAttributeType.REQUIRES_NEW; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.NonUniqueResultException; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import javax.persistence.StoredProcedureQuery; +import jakarta.ejb.Stateless; +import jakarta.ejb.TransactionAttribute; +import static jakarta.ejb.TransactionAttributeType.REQUIRES_NEW; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.NoResultException; +import jakarta.persistence.NonUniqueResultException; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; +import jakarta.persistence.StoredProcedureQuery; import org.apache.commons.lang3.StringUtils; import org.ocpsoft.common.util.Strings; @@ -134,7 +134,7 @@ private DvObject runFindByGlobalId(Query query, GlobalId gid, DvObject.DType dty query.setParameter("authority", gid.getAuthority()); query.setParameter("dtype", dtype.getDType()); foundDvObject = (DvObject) query.getSingleResult(); - } catch (javax.persistence.NoResultException e) { + } catch (jakarta.persistence.NoResultException e) { // (set to .info, this can fill the log file with thousands of // these messages during a large harvest run) logger.fine("no dvObject found: " + gid.asString()); @@ -155,7 +155,7 @@ private Long runFindIdByGlobalId(Query query, GlobalId gid, DvObject.DType dtype query.setParameter("authority", gid.getAuthority()); query.setParameter("dtype", dtype.getDType()); foundDvObject = (Long) query.getSingleResult(); - } catch (javax.persistence.NoResultException e) { + } catch (jakarta.persistence.NoResultException e) { // (set to .info, this can fill the log file with thousands of // these messages during a large harvest run) logger.fine("no dvObject found: " + gid.asString()); diff --git a/src/main/java/edu/harvard/iq/dataverse/EditDataFilesPageHelper.java b/src/main/java/edu/harvard/iq/dataverse/EditDataFilesPageHelper.java index 1bf6bee82eb..883baeedef4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/EditDataFilesPageHelper.java +++ b/src/main/java/edu/harvard/iq/dataverse/EditDataFilesPageHelper.java @@ -4,8 +4,8 @@ import edu.harvard.iq.dataverse.util.file.CreateDataFileResult; import org.apache.commons.text.StringEscapeUtils; -import javax.ejb.Stateless; -import javax.inject.Inject; +import jakarta.ejb.Stateless; +import jakarta.inject.Inject; import java.util.Arrays; import java.util.List; import java.util.Optional; diff --git a/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java b/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java index 1c033b37872..02a148f8cc5 100644 --- a/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java @@ -39,7 +39,6 @@ import edu.harvard.iq.dataverse.util.FileUtil; import edu.harvard.iq.dataverse.util.JsfHelper; import edu.harvard.iq.dataverse.util.SystemConfig; -import edu.harvard.iq.dataverse.util.URLTokenUtil; import edu.harvard.iq.dataverse.util.WebloaderUtil; import edu.harvard.iq.dataverse.util.BundleUtil; import edu.harvard.iq.dataverse.util.EjbUtil; @@ -58,23 +57,23 @@ import java.util.Map; import java.util.Optional; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.faces.application.FacesMessage; -import javax.faces.context.FacesContext; -import javax.faces.event.ActionEvent; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.context.FacesContext; +import jakarta.faces.event.ActionEvent; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; import edu.harvard.iq.dataverse.util.file.CreateDataFileResult; import org.primefaces.event.FileUploadEvent; import org.primefaces.model.file.UploadedFile; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.JsonArray; -import javax.json.JsonReader; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonArray; +import jakarta.json.JsonReader; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.io.IOUtils; import org.apache.commons.httpclient.methods.GetMethod; @@ -82,10 +81,10 @@ import java.util.Collection; import java.util.Set; import java.util.logging.Level; -import javax.faces.event.AjaxBehaviorEvent; -import javax.faces.event.FacesEvent; -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletResponse; +import jakarta.faces.event.AjaxBehaviorEvent; +import jakarta.faces.event.FacesEvent; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.mutable.MutableBoolean; import org.primefaces.PrimeFaces; diff --git a/src/main/java/edu/harvard/iq/dataverse/EjbDataverseEngine.java b/src/main/java/edu/harvard/iq/dataverse/EjbDataverseEngine.java index 7185887ecc3..bad8903c091 100644 --- a/src/main/java/edu/harvard/iq/dataverse/EjbDataverseEngine.java +++ b/src/main/java/edu/harvard/iq/dataverse/EjbDataverseEngine.java @@ -24,11 +24,10 @@ import edu.harvard.iq.dataverse.search.IndexServiceBean; import edu.harvard.iq.dataverse.search.SearchServiceBean; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Named; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; import edu.harvard.iq.dataverse.search.SolrIndexServiceBean; import edu.harvard.iq.dataverse.search.savedsearch.SavedSearchServiceBean; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; @@ -41,16 +40,16 @@ import java.util.Stack; import java.util.logging.Level; import java.util.logging.Logger; -import javax.annotation.Resource; -import javax.ejb.EJBContext; -import javax.ejb.EJBException; -import javax.ejb.TransactionAttribute; -import static javax.ejb.TransactionAttributeType.REQUIRES_NEW; -import static javax.ejb.TransactionAttributeType.SUPPORTS; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.validation.ConstraintViolation; -import javax.validation.ConstraintViolationException; +import jakarta.annotation.Resource; +import jakarta.ejb.EJBContext; +import jakarta.ejb.EJBException; +import jakarta.ejb.TransactionAttribute; +import static jakarta.ejb.TransactionAttributeType.REQUIRES_NEW; +import static jakarta.ejb.TransactionAttributeType.SUPPORTS; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; /** * An EJB capable of executing {@link Command}s in a JEE environment. diff --git a/src/main/java/edu/harvard/iq/dataverse/EjbDataverseEngineInner.java b/src/main/java/edu/harvard/iq/dataverse/EjbDataverseEngineInner.java index d8339dce856..891fe91dc66 100644 --- a/src/main/java/edu/harvard/iq/dataverse/EjbDataverseEngineInner.java +++ b/src/main/java/edu/harvard/iq/dataverse/EjbDataverseEngineInner.java @@ -4,13 +4,13 @@ import edu.harvard.iq.dataverse.engine.command.Command; import edu.harvard.iq.dataverse.engine.command.CommandContext; import edu.harvard.iq.dataverse.engine.command.exception.CommandException; -import javax.annotation.Resource; -import javax.ejb.EJBContext; -import javax.ejb.Stateless; -import javax.ejb.TransactionAttribute; -import static javax.ejb.TransactionAttributeType.REQUIRED; +import jakarta.annotation.Resource; +import jakarta.ejb.EJBContext; +import jakarta.ejb.Stateless; +import jakarta.ejb.TransactionAttribute; +import static jakarta.ejb.TransactionAttributeType.REQUIRED; -import javax.inject.Named; +import jakarta.inject.Named; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/Embargo.java b/src/main/java/edu/harvard/iq/dataverse/Embargo.java index eac83edd296..29959b9f2d4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Embargo.java +++ b/src/main/java/edu/harvard/iq/dataverse/Embargo.java @@ -1,7 +1,7 @@ package edu.harvard.iq.dataverse; -import javax.persistence.*; +import jakarta.persistence.*; import edu.harvard.iq.dataverse.util.BundleUtil; diff --git a/src/main/java/edu/harvard/iq/dataverse/EmbargoServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/EmbargoServiceBean.java index afbeab404c7..d0a8d214959 100644 --- a/src/main/java/edu/harvard/iq/dataverse/EmbargoServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/EmbargoServiceBean.java @@ -3,12 +3,12 @@ import edu.harvard.iq.dataverse.actionlogging.ActionLogRecord; import edu.harvard.iq.dataverse.actionlogging.ActionLogServiceBean; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; import java.util.List; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/ExternalVocabularyValue.java b/src/main/java/edu/harvard/iq/dataverse/ExternalVocabularyValue.java index 3618da79630..7ebfa0302ac 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ExternalVocabularyValue.java +++ b/src/main/java/edu/harvard/iq/dataverse/ExternalVocabularyValue.java @@ -9,13 +9,13 @@ import java.io.Serializable; import java.sql.Timestamp; 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.Index; -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.Index; +import jakarta.persistence.Table; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/FacetConverter.java b/src/main/java/edu/harvard/iq/dataverse/FacetConverter.java index 75ef62200bf..fd41315dbc0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FacetConverter.java +++ b/src/main/java/edu/harvard/iq/dataverse/FacetConverter.java @@ -5,13 +5,13 @@ */ package edu.harvard.iq.dataverse; -import javax.ejb.EJB; -import javax.enterprise.inject.spi.CDI; +import jakarta.ejb.EJB; +import jakarta.enterprise.inject.spi.CDI; -import javax.faces.component.UIComponent; -import javax.faces.context.FacesContext; -import javax.faces.convert.Converter; -import javax.faces.convert.FacesConverter; +import jakarta.faces.component.UIComponent; +import jakarta.faces.context.FacesContext; +import jakarta.faces.convert.Converter; +import jakarta.faces.convert.FacesConverter; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/FeaturedDataverseServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/FeaturedDataverseServiceBean.java index e7362587c36..d4d701cb02f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FeaturedDataverseServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/FeaturedDataverseServiceBean.java @@ -9,11 +9,11 @@ import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/FileAccessRequest.java b/src/main/java/edu/harvard/iq/dataverse/FileAccessRequest.java index 76c5df4409a..6f68815c2ca 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FileAccessRequest.java +++ b/src/main/java/edu/harvard/iq/dataverse/FileAccessRequest.java @@ -2,16 +2,16 @@ import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; -import javax.persistence.Column; -import javax.persistence.Embeddable; -import javax.persistence.EmbeddedId; -import javax.persistence.Entity; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.MapsId; -import javax.persistence.Table; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import jakarta.persistence.EmbeddedId; +import jakarta.persistence.Entity; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.MapsId; +import jakarta.persistence.Table; +import jakarta.persistence.Temporal; +import jakarta.persistence.TemporalType; import java.io.Serializable; import java.util.Date; diff --git a/src/main/java/edu/harvard/iq/dataverse/FileDirectoryNameValidator.java b/src/main/java/edu/harvard/iq/dataverse/FileDirectoryNameValidator.java index e0c2b83ab65..84c033afcaf 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FileDirectoryNameValidator.java +++ b/src/main/java/edu/harvard/iq/dataverse/FileDirectoryNameValidator.java @@ -7,8 +7,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/FileDownload.java b/src/main/java/edu/harvard/iq/dataverse/FileDownload.java index fad03d2a0a1..a79281f71f0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FileDownload.java +++ b/src/main/java/edu/harvard/iq/dataverse/FileDownload.java @@ -6,18 +6,18 @@ package edu.harvard.iq.dataverse; import java.io.Serializable; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; -import javax.persistence.Transient; -import javax.persistence.CascadeType; -import javax.persistence.OneToOne; -import javax.persistence.MapsId; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Temporal; +import jakarta.persistence.TemporalType; +import jakarta.persistence.Transient; +import jakarta.persistence.CascadeType; +import jakarta.persistence.OneToOne; +import jakarta.persistence.MapsId; +import jakarta.persistence.FetchType; +import jakarta.persistence.JoinColumn; import java.util.Date; diff --git a/src/main/java/edu/harvard/iq/dataverse/FileDownloadHelper.java b/src/main/java/edu/harvard/iq/dataverse/FileDownloadHelper.java index 850efc2f1ae..c4b4978e0f8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FileDownloadHelper.java +++ b/src/main/java/edu/harvard/iq/dataverse/FileDownloadHelper.java @@ -18,10 +18,10 @@ import java.util.List; import java.util.Map; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.ejb.EJB; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; import org.primefaces.PrimeFaces; //import org.primefaces.context.RequestContext; diff --git a/src/main/java/edu/harvard/iq/dataverse/FileDownloadServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/FileDownloadServiceBean.java index a90489be29a..e2b07717358 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FileDownloadServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/FileDownloadServiceBean.java @@ -18,7 +18,6 @@ import edu.harvard.iq.dataverse.privateurl.PrivateUrl; import edu.harvard.iq.dataverse.privateurl.PrivateUrlServiceBean; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; -import edu.harvard.iq.dataverse.util.BundleUtil; import edu.harvard.iq.dataverse.util.FileUtil; import edu.harvard.iq.dataverse.util.StringUtil; import java.io.IOException; @@ -29,16 +28,16 @@ import java.util.List; import java.util.UUID; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.faces.context.FacesContext; -import javax.inject.Inject; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletResponse; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.faces.context.FacesContext; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.HttpServletResponse; import org.primefaces.PrimeFaces; //import org.primefaces.context.RequestContext; diff --git a/src/main/java/edu/harvard/iq/dataverse/FileMetadata.java b/src/main/java/edu/harvard/iq/dataverse/FileMetadata.java index 01131bdca01..461c8b14e46 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FileMetadata.java +++ b/src/main/java/edu/harvard/iq/dataverse/FileMetadata.java @@ -22,24 +22,24 @@ import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.CascadeType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.ManyToMany; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.OrderBy; -import javax.persistence.Table; -import javax.persistence.Transient; -import javax.persistence.Version; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.JoinTable; +import jakarta.persistence.ManyToMany; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OrderBy; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; +import jakarta.persistence.Version; import edu.harvard.iq.dataverse.datavariable.CategoryMetadata; import edu.harvard.iq.dataverse.datavariable.DataVariable; @@ -49,12 +49,12 @@ import edu.harvard.iq.dataverse.util.StringUtil; import java.util.HashSet; import java.util.Set; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; -import javax.validation.ValidatorFactory; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; import org.hibernate.validator.constraints.NotBlank; -import javax.validation.constraints.Pattern; +import jakarta.validation.constraints.Pattern; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/FilePage.java b/src/main/java/edu/harvard/iq/dataverse/FilePage.java index e460fc86aa4..58316db245d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FilePage.java +++ b/src/main/java/edu/harvard/iq/dataverse/FilePage.java @@ -30,8 +30,6 @@ import edu.harvard.iq.dataverse.externaltools.ExternalToolServiceBean; import edu.harvard.iq.dataverse.makedatacount.MakeDataCountLoggingServiceBean; import edu.harvard.iq.dataverse.makedatacount.MakeDataCountLoggingServiceBean.MakeDataCountEntry; -import edu.harvard.iq.dataverse.makedatacount.MakeDataCountUtil; -import edu.harvard.iq.dataverse.privateurl.PrivateUrl; import edu.harvard.iq.dataverse.privateurl.PrivateUrlServiceBean; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import edu.harvard.iq.dataverse.util.BundleUtil; @@ -39,9 +37,8 @@ import edu.harvard.iq.dataverse.util.JsfHelper; import static edu.harvard.iq.dataverse.util.JsfHelper.JH; import edu.harvard.iq.dataverse.util.SystemConfig; -import edu.harvard.iq.dataverse.util.json.JsonUtil; + import java.io.IOException; -import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -49,19 +46,19 @@ import java.util.List; import java.util.Set; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.faces.application.FacesMessage; -import javax.faces.component.UIComponent; -import javax.faces.context.FacesContext; -import javax.faces.validator.ValidatorException; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; -import javax.json.JsonArray; -import javax.json.JsonObject; -import javax.json.JsonValue; -import javax.validation.ConstraintViolation; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.component.UIComponent; +import jakarta.faces.context.FacesContext; +import jakarta.faces.validator.ValidatorException; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import jakarta.json.JsonValue; +import jakarta.validation.ConstraintViolation; import org.primefaces.PrimeFaces; import org.primefaces.component.tabview.TabView; diff --git a/src/main/java/edu/harvard/iq/dataverse/FileUploadRenderer.java b/src/main/java/edu/harvard/iq/dataverse/FileUploadRenderer.java index 5e73ef65f25..ce3b0d65875 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FileUploadRenderer.java +++ b/src/main/java/edu/harvard/iq/dataverse/FileUploadRenderer.java @@ -6,8 +6,8 @@ package edu.harvard.iq.dataverse; -import javax.faces.component.UIComponent; -import javax.faces.context.FacesContext; +import jakarta.faces.component.UIComponent; +import jakarta.faces.context.FacesContext; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/ForeignMetadataFieldMapping.java b/src/main/java/edu/harvard/iq/dataverse/ForeignMetadataFieldMapping.java index 40d219d2638..db83ab953a1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ForeignMetadataFieldMapping.java +++ b/src/main/java/edu/harvard/iq/dataverse/ForeignMetadataFieldMapping.java @@ -3,13 +3,8 @@ package edu.harvard.iq.dataverse; import java.io.Serializable; -import javax.persistence.*; +import jakarta.persistence.*; import java.util.Collection; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeMap; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/ForeignMetadataFormatMapping.java b/src/main/java/edu/harvard/iq/dataverse/ForeignMetadataFormatMapping.java index 0fac75257c8..eb7b97b1a84 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ForeignMetadataFormatMapping.java +++ b/src/main/java/edu/harvard/iq/dataverse/ForeignMetadataFormatMapping.java @@ -7,18 +7,18 @@ package edu.harvard.iq.dataverse; import java.io.Serializable; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; import java.util.List; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Index; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.OneToMany; -import javax.persistence.Table; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Index; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/Guestbook.java b/src/main/java/edu/harvard/iq/dataverse/Guestbook.java index 18913bfd5bf..2ef23d1f925 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Guestbook.java +++ b/src/main/java/edu/harvard/iq/dataverse/Guestbook.java @@ -3,27 +3,25 @@ import edu.harvard.iq.dataverse.util.BundleUtil; import java.io.Serializable; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; -import javax.persistence.CascadeType; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.OneToMany; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToMany; import java.util.List; import java.util.Objects; -import javax.persistence.Column; -import javax.persistence.ManyToOne; -import javax.persistence.OrderBy; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; -import javax.persistence.Transient; +import jakarta.persistence.Column; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OrderBy; +import jakarta.persistence.Temporal; +import jakarta.persistence.TemporalType; +import jakarta.persistence.Transient; import edu.harvard.iq.dataverse.util.DateUtil; -import org.apache.commons.text.StringEscapeUtils; import org.hibernate.validator.constraints.NotBlank; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/GuestbookPage.java b/src/main/java/edu/harvard/iq/dataverse/GuestbookPage.java index 7cbb69e5c1d..9fb584a9133 100644 --- a/src/main/java/edu/harvard/iq/dataverse/GuestbookPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/GuestbookPage.java @@ -17,13 +17,13 @@ import java.util.Iterator; import java.util.List; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.faces.application.FacesMessage; -import javax.faces.context.FacesContext; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.context.FacesContext; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; import org.apache.commons.lang3.StringUtils; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java index 69404482fce..0057fbeddab 100644 --- a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java +++ b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java @@ -13,8 +13,8 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; -import javax.persistence.*; -import javax.validation.constraints.Size; +import jakarta.persistence.*; +import jakarta.validation.constraints.Size; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponseServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponseServiceBean.java index 2f795a4da74..bd598d2dca0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponseServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponseServiceBean.java @@ -21,17 +21,17 @@ import java.util.List; import java.util.Map; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.ejb.TransactionAttribute; -import javax.ejb.TransactionAttributeType; -import javax.faces.model.SelectItem; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import javax.persistence.StoredProcedureQuery; -import javax.persistence.TypedQuery; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.ejb.TransactionAttribute; +import jakarta.ejb.TransactionAttributeType; +import jakarta.faces.model.SelectItem; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; +import jakarta.persistence.StoredProcedureQuery; +import jakarta.persistence.TypedQuery; import org.apache.commons.text.StringEscapeUtils; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponsesPage.java b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponsesPage.java index 23aac4a24a3..c53df93def8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponsesPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponsesPage.java @@ -6,20 +6,19 @@ package edu.harvard.iq.dataverse; import edu.harvard.iq.dataverse.engine.command.impl.UpdateDataverseCommand; -import static edu.harvard.iq.dataverse.util.JsfHelper.JH; import edu.harvard.iq.dataverse.util.BundleUtil; import edu.harvard.iq.dataverse.util.SystemConfig; import java.util.List; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.faces.application.FacesMessage; -import javax.faces.context.FacesContext; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletResponse; +import jakarta.ejb.EJB; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.context.FacesContext; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.HttpServletResponse; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/GuestbookServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/GuestbookServiceBean.java index 5394ddc652a..fcd4e91d455 100644 --- a/src/main/java/edu/harvard/iq/dataverse/GuestbookServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/GuestbookServiceBean.java @@ -5,12 +5,11 @@ */ package edu.harvard.iq.dataverse; -import java.util.List; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/HandlenetServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/HandlenetServiceBean.java index 9ac4d5e29ae..5c7a10e8378 100644 --- a/src/main/java/edu/harvard/iq/dataverse/HandlenetServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/HandlenetServiceBean.java @@ -29,8 +29,8 @@ import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; import java.security.PrivateKey; /* Handlenet imports: */ diff --git a/src/main/java/edu/harvard/iq/dataverse/HarvestingClientsPage.java b/src/main/java/edu/harvard/iq/dataverse/HarvestingClientsPage.java index 5be7578f7f8..f008db1403f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/HarvestingClientsPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/HarvestingClientsPage.java @@ -27,17 +27,17 @@ import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Pattern; -import javax.ejb.EJB; -import javax.faces.application.FacesMessage; -import javax.faces.component.UIComponent; -import javax.faces.component.UIInput; -import javax.faces.context.FacesContext; -import javax.faces.event.ActionEvent; -import javax.faces.model.SelectItem; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; -import javax.servlet.http.HttpServletRequest; +import jakarta.ejb.EJB; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.component.UIComponent; +import jakarta.faces.component.UIInput; +import jakarta.faces.context.FacesContext; +import jakarta.faces.event.ActionEvent; +import jakarta.faces.model.SelectItem; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/HarvestingDataverseConfig.java b/src/main/java/edu/harvard/iq/dataverse/HarvestingDataverseConfig.java index 28df6e19e65..6709b978c47 100644 --- a/src/main/java/edu/harvard/iq/dataverse/HarvestingDataverseConfig.java +++ b/src/main/java/edu/harvard/iq/dataverse/HarvestingDataverseConfig.java @@ -6,16 +6,16 @@ package edu.harvard.iq.dataverse; import java.io.Serializable; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.OneToOne; -import javax.persistence.Table; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/HarvestingSetsPage.java b/src/main/java/edu/harvard/iq/dataverse/HarvestingSetsPage.java index 432683a5797..6dbba34920b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/HarvestingSetsPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/HarvestingSetsPage.java @@ -6,11 +6,6 @@ package edu.harvard.iq.dataverse; import edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean; -import edu.harvard.iq.dataverse.engine.command.exception.CommandException; -import edu.harvard.iq.dataverse.engine.command.impl.CreateHarvestingClientCommand; -import edu.harvard.iq.dataverse.engine.command.impl.UpdateHarvestingClientCommand; -import edu.harvard.iq.dataverse.harvest.client.HarvestingClient; -import edu.harvard.iq.dataverse.harvest.client.HarvestingClientServiceBean; import edu.harvard.iq.dataverse.harvest.server.OAIRecord; import edu.harvard.iq.dataverse.harvest.server.OAIRecordServiceBean; import edu.harvard.iq.dataverse.harvest.server.OAISet; @@ -26,15 +21,15 @@ import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Pattern; -import javax.ejb.EJB; -import javax.faces.application.FacesMessage; -import javax.faces.component.UIComponent; -import javax.faces.component.UIInput; -import javax.faces.context.FacesContext; -import javax.faces.event.ActionEvent; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.ejb.EJB; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.component.UIComponent; +import jakarta.faces.component.UIInput; +import jakarta.faces.context.FacesContext; +import jakarta.faces.event.ActionEvent; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; import org.apache.commons.lang3.StringUtils; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/HomepageServlet.java b/src/main/java/edu/harvard/iq/dataverse/HomepageServlet.java index ef9b3267db4..e1864194436 100644 --- a/src/main/java/edu/harvard/iq/dataverse/HomepageServlet.java +++ b/src/main/java/edu/harvard/iq/dataverse/HomepageServlet.java @@ -7,12 +7,12 @@ import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import java.io.IOException; -import javax.ejb.EJB; -import javax.servlet.RequestDispatcher; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.ejb.EJB; +import jakarta.servlet.RequestDispatcher; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/LinkValidator.java b/src/main/java/edu/harvard/iq/dataverse/LinkValidator.java index 2ecfc55f67e..7d540f0a425 100644 --- a/src/main/java/edu/harvard/iq/dataverse/LinkValidator.java +++ b/src/main/java/edu/harvard/iq/dataverse/LinkValidator.java @@ -5,13 +5,13 @@ */ package edu.harvard.iq.dataverse; -import javax.faces.application.FacesMessage; -import javax.faces.component.UIComponent; -import javax.faces.component.UIInput; -import javax.faces.context.FacesContext; -import javax.faces.validator.FacesValidator; -import javax.faces.validator.Validator; -import javax.faces.validator.ValidatorException; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.component.UIComponent; +import jakarta.faces.component.UIInput; +import jakarta.faces.context.FacesContext; +import jakarta.faces.validator.FacesValidator; +import jakarta.faces.validator.Validator; +import jakarta.faces.validator.ValidatorException; import edu.harvard.iq.dataverse.util.BundleUtil; @FacesValidator(value = "linkValidator") diff --git a/src/main/java/edu/harvard/iq/dataverse/LoginPage.java b/src/main/java/edu/harvard/iq/dataverse/LoginPage.java index 2420ce08550..16d2cc53cb9 100644 --- a/src/main/java/edu/harvard/iq/dataverse/LoginPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/LoginPage.java @@ -9,30 +9,27 @@ import edu.harvard.iq.dataverse.authorization.exceptions.AuthenticationFailedException; import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinAuthenticationProvider; import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinUserServiceBean; -import edu.harvard.iq.dataverse.authorization.providers.shib.ShibAuthenticationProvider; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import edu.harvard.iq.dataverse.util.BundleUtil; import edu.harvard.iq.dataverse.util.JsfHelper; -import edu.harvard.iq.dataverse.util.SessionUtil; -import static edu.harvard.iq.dataverse.util.JsfHelper.JH; import edu.harvard.iq.dataverse.util.SystemConfig; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.faces.application.FacesMessage; -import javax.faces.component.UIComponent; -import javax.faces.context.FacesContext; -import javax.faces.event.AjaxBehaviorEvent; -import javax.faces.validator.ValidatorException; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; -import javax.servlet.http.HttpServletRequest; +import jakarta.ejb.EJB; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.component.UIComponent; +import jakarta.faces.context.FacesContext; +import jakarta.faces.event.AjaxBehaviorEvent; +import jakarta.faces.validator.ValidatorException; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.servlet.http.HttpServletRequest; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java index bc7b34ee8b7..d3db8c7e9a2 100644 --- a/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java @@ -5,7 +5,6 @@ */ package edu.harvard.iq.dataverse; -import com.sun.mail.smtp.SMTPSendFailedException; import edu.harvard.iq.dataverse.authorization.groups.Group; import edu.harvard.iq.dataverse.authorization.groups.GroupServiceBean; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; @@ -24,23 +23,20 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Date; -import java.util.Properties; -import java.util.Map; -import java.util.HashMap; import java.util.List; import java.util.Set; import java.util.logging.Logger; -import javax.annotation.Resource; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.mail.Address; -import javax.mail.Message; -import javax.mail.MessagingException; -import javax.mail.Session; -import javax.mail.Transport; -import javax.mail.internet.AddressException; -import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeMessage; +import jakarta.annotation.Resource; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.mail.Address; +import jakarta.mail.Message; +import jakarta.mail.MessagingException; +import jakarta.mail.Session; +import jakarta.mail.Transport; +import jakarta.mail.internet.AddressException; +import jakarta.mail.internet.InternetAddress; +import jakarta.mail.internet.MimeMessage; import edu.harvard.iq.dataverse.validation.EMailValidator; import org.apache.commons.lang3.StringUtils; @@ -124,7 +120,7 @@ public boolean sendSystemEmail(String to, String subject, String messageText, bo try { Transport.send(msg, recipients); sent = true; - } catch (SMTPSendFailedException ssfe) { + } catch (MessagingException ssfe) { logger.warning("Failed to send mail to: " + to); logger.warning("SMTPSendFailedException Message: " + ssfe); } @@ -616,7 +612,7 @@ public String getMessageTextBasedOnNotification(UserNotification userNotificatio case DATASETMENTIONED: String additionalInfo = userNotification.getAdditionalInfo(); dataset = (Dataset) targetObject; - javax.json.JsonObject citingResource = null; + jakarta.json.JsonObject citingResource = null; citingResource = JsonUtil.getJsonObject(additionalInfo); diff --git a/src/main/java/edu/harvard/iq/dataverse/ManageFilePermissionsPage.java b/src/main/java/edu/harvard/iq/dataverse/ManageFilePermissionsPage.java index fd309790026..1b4af29c915 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ManageFilePermissionsPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/ManageFilePermissionsPage.java @@ -12,7 +12,6 @@ import edu.harvard.iq.dataverse.authorization.Permission; import edu.harvard.iq.dataverse.authorization.RoleAssignee; import edu.harvard.iq.dataverse.authorization.RoleAssigneeDisplayInfo; -import edu.harvard.iq.dataverse.authorization.groups.Group; import edu.harvard.iq.dataverse.authorization.groups.GroupServiceBean; import edu.harvard.iq.dataverse.authorization.groups.impl.explicit.ExplicitGroupServiceBean; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; @@ -28,14 +27,14 @@ import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.faces.application.FacesMessage; -import javax.faces.event.ActionEvent; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; +import jakarta.ejb.EJB; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.event.ActionEvent; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import org.apache.commons.lang3.ObjectUtils; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/ManageGroupsPage.java b/src/main/java/edu/harvard/iq/dataverse/ManageGroupsPage.java index 8513ca33b47..583e195ab0d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ManageGroupsPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/ManageGroupsPage.java @@ -22,17 +22,17 @@ import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Pattern; -import javax.ejb.EJB; -import javax.faces.application.FacesMessage; -import javax.faces.component.UIComponent; -import javax.faces.component.UIInput; -import javax.faces.context.FacesContext; -import javax.faces.event.ActionEvent; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; +import jakarta.ejb.EJB; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.component.UIComponent; +import jakarta.faces.component.UIInput; +import jakarta.faces.context.FacesContext; +import jakarta.faces.event.ActionEvent; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import org.apache.commons.lang3.StringUtils; diff --git a/src/main/java/edu/harvard/iq/dataverse/ManageGuestbooksPage.java b/src/main/java/edu/harvard/iq/dataverse/ManageGuestbooksPage.java index 7db0ecc0767..6b7737ce313 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ManageGuestbooksPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/ManageGuestbooksPage.java @@ -11,17 +11,17 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.faces.application.FacesMessage; -import javax.faces.context.FacesContext; -import javax.faces.event.ActionEvent; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletResponse; +import jakarta.ejb.EJB; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.context.FacesContext; +import jakarta.faces.event.ActionEvent; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.HttpServletResponse; /** * @@ -325,7 +325,7 @@ public void setDisplayDownloadAll(boolean displayDownloadAll) { this.displayDownloadAll = displayDownloadAll; } - public String updateGuestbooksRoot(javax.faces.event.AjaxBehaviorEvent event) throws javax.faces.event.AbortProcessingException { + public String updateGuestbooksRoot(jakarta.faces.event.AjaxBehaviorEvent event) throws jakarta.faces.event.AbortProcessingException { try { dataverse = engineService.submit( new UpdateDataverseGuestbookRootCommand(!isInheritGuestbooksValue(), diff --git a/src/main/java/edu/harvard/iq/dataverse/ManagePermissionsPage.java b/src/main/java/edu/harvard/iq/dataverse/ManagePermissionsPage.java index e71e04bc42f..bf78b9d088f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ManagePermissionsPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/ManagePermissionsPage.java @@ -29,18 +29,17 @@ import java.util.Date; import java.util.LinkedList; import java.util.List; -import java.util.ResourceBundle; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.faces.application.FacesMessage; -import javax.faces.event.ActionEvent; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; +import jakarta.ejb.EJB; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.event.ActionEvent; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import org.apache.commons.text.StringEscapeUtils; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/ManageTemplatesPage.java b/src/main/java/edu/harvard/iq/dataverse/ManageTemplatesPage.java index 4578a01e693..18164f86587 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ManageTemplatesPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/ManageTemplatesPage.java @@ -14,14 +14,14 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.faces.application.FacesMessage; -import javax.faces.event.ActionEvent; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; +import jakarta.ejb.EJB; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.event.ActionEvent; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import edu.harvard.iq.dataverse.util.BundleUtil; /** * @@ -234,7 +234,7 @@ public void viewSelectedTemplate(Template selectedTemplate) { tempPage.setTemplate(selectedTemplate); } - public String updateTemplatesRoot(javax.faces.event.AjaxBehaviorEvent event) throws javax.faces.event.AbortProcessingException { + public String updateTemplatesRoot(jakarta.faces.event.AjaxBehaviorEvent event) throws jakarta.faces.event.AbortProcessingException { try { if (dataverse.getOwner() != null) { if (isInheritTemplatesValue() && dataverse.getDefaultTemplate() == null && dataverse.getOwner().getDefaultTemplate() != null) { diff --git a/src/main/java/edu/harvard/iq/dataverse/MetadataBlock.java b/src/main/java/edu/harvard/iq/dataverse/MetadataBlock.java index 33e75efffb5..0fd7c2efbc7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/MetadataBlock.java +++ b/src/main/java/edu/harvard/iq/dataverse/MetadataBlock.java @@ -8,21 +8,21 @@ import java.util.List; import java.util.MissingResourceException; import java.util.Objects; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.OneToMany; -import javax.persistence.OneToOne; -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.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OneToOne; +import jakarta.persistence.OrderBy; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/MetadataBlockConverter.java b/src/main/java/edu/harvard/iq/dataverse/MetadataBlockConverter.java index c5bd48ae785..49c50e82efb 100644 --- a/src/main/java/edu/harvard/iq/dataverse/MetadataBlockConverter.java +++ b/src/main/java/edu/harvard/iq/dataverse/MetadataBlockConverter.java @@ -5,13 +5,13 @@ */ package edu.harvard.iq.dataverse; -import javax.ejb.EJB; -import javax.enterprise.inject.spi.CDI; +import jakarta.ejb.EJB; +import jakarta.enterprise.inject.spi.CDI; -import javax.faces.component.UIComponent; -import javax.faces.context.FacesContext; -import javax.faces.convert.Converter; -import javax.faces.convert.FacesConverter; +import jakarta.faces.component.UIComponent; +import jakarta.faces.context.FacesContext; +import jakarta.faces.convert.Converter; +import jakarta.faces.convert.FacesConverter; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/MetadataBlockServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/MetadataBlockServiceBean.java index a25480102f2..466a3bc3f70 100644 --- a/src/main/java/edu/harvard/iq/dataverse/MetadataBlockServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/MetadataBlockServiceBean.java @@ -1,11 +1,11 @@ package edu.harvard.iq.dataverse; import java.util.List; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.PersistenceContext; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.NoResultException; +import jakarta.persistence.PersistenceContext; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/Metric.java b/src/main/java/edu/harvard/iq/dataverse/Metric.java index 5526604f77c..0e71ab44db4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Metric.java +++ b/src/main/java/edu/harvard/iq/dataverse/Metric.java @@ -5,21 +5,20 @@ */ package edu.harvard.iq.dataverse; -import java.io.IOException; import java.io.Serializable; import java.sql.Timestamp; 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.Index; -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.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import jakarta.persistence.Temporal; +import jakarta.persistence.TemporalType; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/NavigationWrapper.java b/src/main/java/edu/harvard/iq/dataverse/NavigationWrapper.java index 37a11396f37..d2c522b5c89 100644 --- a/src/main/java/edu/harvard/iq/dataverse/NavigationWrapper.java +++ b/src/main/java/edu/harvard/iq/dataverse/NavigationWrapper.java @@ -14,12 +14,12 @@ import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; -import javax.faces.context.FacesContext; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.faces.context.FacesContext; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/PackagePopupFragmentBean.java b/src/main/java/edu/harvard/iq/dataverse/PackagePopupFragmentBean.java index fac2abeddb8..0c5218fb927 100644 --- a/src/main/java/edu/harvard/iq/dataverse/PackagePopupFragmentBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/PackagePopupFragmentBean.java @@ -6,8 +6,8 @@ package edu.harvard.iq.dataverse; -import javax.faces.view.ViewScoped; -import javax.inject.Named; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Named; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/PermissionServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/PermissionServiceBean.java index 8c0a0bf90b0..a1de33a764e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/PermissionServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/PermissionServiceBean.java @@ -1,6 +1,5 @@ package edu.harvard.iq.dataverse; -import edu.harvard.iq.dataverse.DatasetLock.Reason; import edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean; import edu.harvard.iq.dataverse.authorization.DataverseRole; import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinUserServiceBean; @@ -17,14 +16,14 @@ import java.util.Map; import java.util.Set; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Inject; +import jakarta.inject.Named; import java.util.HashSet; import java.util.List; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import static edu.harvard.iq.dataverse.engine.command.CommandHelper.CH; import edu.harvard.iq.dataverse.engine.command.DataverseRequest; import edu.harvard.iq.dataverse.engine.command.exception.IllegalCommandException; @@ -41,7 +40,7 @@ import java.util.logging.Level; import java.util.stream.Collectors; import static java.util.stream.Collectors.toList; -import javax.persistence.Query; +import jakarta.persistence.Query; /** * Your one-stop-shop for deciding which user can do what action on which diff --git a/src/main/java/edu/harvard/iq/dataverse/PermissionsWrapper.java b/src/main/java/edu/harvard/iq/dataverse/PermissionsWrapper.java index 4ee45fc85a1..5ce9edb3a9e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/PermissionsWrapper.java +++ b/src/main/java/edu/harvard/iq/dataverse/PermissionsWrapper.java @@ -14,10 +14,10 @@ import java.util.HashMap; import java.util.Map; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.ejb.EJB; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/RoleAssigneeConverter.java b/src/main/java/edu/harvard/iq/dataverse/RoleAssigneeConverter.java index a5e4cebbd95..0d863f47324 100644 --- a/src/main/java/edu/harvard/iq/dataverse/RoleAssigneeConverter.java +++ b/src/main/java/edu/harvard/iq/dataverse/RoleAssigneeConverter.java @@ -7,13 +7,13 @@ package edu.harvard.iq.dataverse; import edu.harvard.iq.dataverse.authorization.RoleAssignee; -import javax.ejb.EJB; -import javax.enterprise.inject.spi.CDI; +import jakarta.ejb.EJB; +import jakarta.enterprise.inject.spi.CDI; -import javax.faces.component.UIComponent; -import javax.faces.context.FacesContext; -import javax.faces.convert.Converter; -import javax.faces.convert.FacesConverter; +import jakarta.faces.component.UIComponent; +import jakarta.faces.context.FacesContext; +import jakarta.faces.convert.Converter; +import jakarta.faces.convert.FacesConverter; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/RoleAssigneeServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/RoleAssigneeServiceBean.java index c6f2b7f28a5..059d5a8ffd3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/RoleAssigneeServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/RoleAssigneeServiceBean.java @@ -21,12 +21,12 @@ import java.util.TreeMap; import java.util.logging.Logger; import java.util.stream.Collectors; -import javax.annotation.PostConstruct; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; +import jakarta.annotation.PostConstruct; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import org.apache.commons.lang3.StringUtils; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/RoleAssignment.java b/src/main/java/edu/harvard/iq/dataverse/RoleAssignment.java index f053a449da4..df004fe1357 100644 --- a/src/main/java/edu/harvard/iq/dataverse/RoleAssignment.java +++ b/src/main/java/edu/harvard/iq/dataverse/RoleAssignment.java @@ -3,19 +3,19 @@ import edu.harvard.iq.dataverse.authorization.DataverseRole; import edu.harvard.iq.dataverse.authorization.RoleAssignee; import java.util.Objects; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.Table; -import javax.persistence.UniqueConstraint; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.Table; +import jakarta.persistence.UniqueConstraint; /** * A role of a user in a Dataverse. A User may have many roles in a given Dataverse. diff --git a/src/main/java/edu/harvard/iq/dataverse/RolePermissionFragment.java b/src/main/java/edu/harvard/iq/dataverse/RolePermissionFragment.java index dd3044d3749..67a9e3ee572 100644 --- a/src/main/java/edu/harvard/iq/dataverse/RolePermissionFragment.java +++ b/src/main/java/edu/harvard/iq/dataverse/RolePermissionFragment.java @@ -26,14 +26,14 @@ import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.faces.application.FacesMessage; -import javax.faces.event.ActionEvent; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; +import jakarta.ejb.EJB; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.event.ActionEvent; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import edu.harvard.iq.dataverse.util.BundleUtil; import org.apache.commons.text.StringEscapeUtils; @@ -92,7 +92,7 @@ public void setInheritAssignments(boolean inheritAssignments) { this.inheritAssignments = inheritAssignments; } - public void updatePermissionRoot(javax.faces.event.AjaxBehaviorEvent event) throws javax.faces.event.AbortProcessingException { + public void updatePermissionRoot(jakarta.faces.event.AjaxBehaviorEvent event) throws jakarta.faces.event.AbortProcessingException { try { dvObject = commandEngine.submit( new UpdatePermissionRootCommand(!inheritAssignments, diff --git a/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java b/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java index a099f5f3939..71318a0184a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java +++ b/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java @@ -17,9 +17,6 @@ import com.amazonaws.services.s3.model.S3Object; import com.amazonaws.services.s3.model.S3ObjectSummary; import edu.harvard.iq.dataverse.api.AbstractApiBean; -import edu.harvard.iq.dataverse.batch.jobs.importer.filesystem.FileRecordWriter; -import edu.harvard.iq.dataverse.engine.command.DataverseRequest; -import edu.harvard.iq.dataverse.engine.command.exception.IllegalCommandException; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import edu.harvard.iq.dataverse.util.FileUtil; import java.io.BufferedReader; @@ -31,9 +28,9 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Named; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; /** * This class is for importing files added to s3 outside of dataverse. diff --git a/src/main/java/edu/harvard/iq/dataverse/SendFeedbackDialog.java b/src/main/java/edu/harvard/iq/dataverse/SendFeedbackDialog.java index 13a7cc51357..6be768321c4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/SendFeedbackDialog.java +++ b/src/main/java/edu/harvard/iq/dataverse/SendFeedbackDialog.java @@ -11,16 +11,16 @@ import java.util.Optional; import java.util.Random; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.faces.application.FacesMessage; -import javax.faces.component.UIComponent; -import javax.faces.context.FacesContext; -import javax.faces.event.ActionEvent; -import javax.faces.validator.ValidatorException; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; -import javax.mail.internet.InternetAddress; +import jakarta.ejb.EJB; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.component.UIComponent; +import jakarta.faces.context.FacesContext; +import jakarta.faces.event.ActionEvent; +import jakarta.faces.validator.ValidatorException; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.mail.internet.InternetAddress; import org.apache.commons.validator.routines.EmailValidator; @ViewScoped diff --git a/src/main/java/edu/harvard/iq/dataverse/SettingsWrapper.java b/src/main/java/edu/harvard/iq/dataverse/SettingsWrapper.java index 31cea6d09cd..51595797e05 100644 --- a/src/main/java/edu/harvard/iq/dataverse/SettingsWrapper.java +++ b/src/main/java/edu/harvard/iq/dataverse/SettingsWrapper.java @@ -26,16 +26,16 @@ import java.util.logging.Logger; import java.util.Set; -import javax.ejb.EJB; -import javax.faces.application.FacesMessage; -import javax.faces.component.UIComponent; -import javax.faces.component.UIInput; -import javax.faces.context.FacesContext; -import javax.faces.validator.ValidatorException; -import javax.faces.view.ViewScoped; -import javax.inject.Named; -import javax.json.JsonObject; -import javax.mail.internet.InternetAddress; +import jakarta.ejb.EJB; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.component.UIComponent; +import jakarta.faces.component.UIInput; +import jakarta.faces.context.FacesContext; +import jakarta.faces.validator.ValidatorException; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Named; +import jakarta.json.JsonObject; +import jakarta.mail.internet.InternetAddress; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/Shib.java b/src/main/java/edu/harvard/iq/dataverse/Shib.java index 0f0e20aba94..bee1182e248 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Shib.java +++ b/src/main/java/edu/harvard/iq/dataverse/Shib.java @@ -25,15 +25,15 @@ import java.util.Date; import java.util.List; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.faces.application.FacesMessage; -import javax.faces.context.ExternalContext; -import javax.faces.context.FacesContext; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; -import javax.servlet.http.HttpServletRequest; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.context.ExternalContext; +import jakarta.faces.context.FacesContext; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.servlet.http.HttpServletRequest; @ViewScoped @Named("Shib") diff --git a/src/main/java/edu/harvard/iq/dataverse/SuperUserPage.java b/src/main/java/edu/harvard/iq/dataverse/SuperUserPage.java index cd6d53fd8a8..adf2e7d3010 100644 --- a/src/main/java/edu/harvard/iq/dataverse/SuperUserPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/SuperUserPage.java @@ -6,11 +6,11 @@ import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; -import javax.ejb.EJB; -import javax.enterprise.context.SessionScoped; -import javax.inject.Inject; -import javax.inject.Named; -import javax.json.JsonObjectBuilder; +import jakarta.ejb.EJB; +import jakarta.enterprise.context.SessionScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.json.JsonObjectBuilder; @SessionScoped @Named("SuperUserPage") diff --git a/src/main/java/edu/harvard/iq/dataverse/Template.java b/src/main/java/edu/harvard/iq/dataverse/Template.java index 7798367b4d9..9166394f7f4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Template.java +++ b/src/main/java/edu/harvard/iq/dataverse/Template.java @@ -12,31 +12,31 @@ import java.util.TreeMap; import java.util.stream.Collectors; -import javax.json.Json; -import javax.json.JsonObjectBuilder; -import javax.json.JsonString; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.OneToOne; -import javax.persistence.Table; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; -import javax.persistence.Transient; -import javax.validation.constraints.Size; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonString; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; +import jakarta.persistence.Temporal; +import jakarta.persistence.TemporalType; +import jakarta.persistence.Transient; +import jakarta.validation.constraints.Size; import edu.harvard.iq.dataverse.util.DateUtil; import edu.harvard.iq.dataverse.util.json.JsonUtil; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; import org.hibernate.validator.constraints.NotBlank; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/TemplateConverter.java b/src/main/java/edu/harvard/iq/dataverse/TemplateConverter.java index 98b24f84801..1d855e029ce 100644 --- a/src/main/java/edu/harvard/iq/dataverse/TemplateConverter.java +++ b/src/main/java/edu/harvard/iq/dataverse/TemplateConverter.java @@ -6,12 +6,12 @@ package edu.harvard.iq.dataverse; -import javax.ejb.EJB; -import javax.enterprise.inject.spi.CDI; -import javax.faces.component.UIComponent; -import javax.faces.context.FacesContext; -import javax.faces.convert.Converter; -import javax.faces.convert.FacesConverter; +import jakarta.ejb.EJB; +import jakarta.enterprise.inject.spi.CDI; +import jakarta.faces.component.UIComponent; +import jakarta.faces.context.FacesContext; +import jakarta.faces.convert.Converter; +import jakarta.faces.convert.FacesConverter; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/TemplatePage.java b/src/main/java/edu/harvard/iq/dataverse/TemplatePage.java index 6da0d99da20..3be566015a0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/TemplatePage.java +++ b/src/main/java/edu/harvard/iq/dataverse/TemplatePage.java @@ -15,12 +15,12 @@ import java.util.Date; import java.util.List; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.faces.application.FacesMessage; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/TemplateServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/TemplateServiceBean.java index f2ac8779d2d..46382fc2588 100644 --- a/src/main/java/edu/harvard/iq/dataverse/TemplateServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/TemplateServiceBean.java @@ -2,14 +2,13 @@ import edu.harvard.iq.dataverse.search.IndexServiceBean; import java.util.List; -import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.TypedQuery; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.TypedQuery; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/TermsOfUseAndAccess.java b/src/main/java/edu/harvard/iq/dataverse/TermsOfUseAndAccess.java index a8616283332..ee865770dbe 100644 --- a/src/main/java/edu/harvard/iq/dataverse/TermsOfUseAndAccess.java +++ b/src/main/java/edu/harvard/iq/dataverse/TermsOfUseAndAccess.java @@ -6,15 +6,15 @@ package edu.harvard.iq.dataverse; import java.io.Serializable; -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.OneToOne; -import javax.persistence.Transient; +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.OneToOne; +import jakarta.persistence.Transient; import edu.harvard.iq.dataverse.license.License; diff --git a/src/main/java/edu/harvard/iq/dataverse/TermsOfUseAndAccessValidator.java b/src/main/java/edu/harvard/iq/dataverse/TermsOfUseAndAccessValidator.java index 2cf78db0f03..ca38a305d63 100644 --- a/src/main/java/edu/harvard/iq/dataverse/TermsOfUseAndAccessValidator.java +++ b/src/main/java/edu/harvard/iq/dataverse/TermsOfUseAndAccessValidator.java @@ -6,8 +6,8 @@ package edu.harvard.iq.dataverse; import edu.harvard.iq.dataverse.util.BundleUtil; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/ThemeWidgetFragment.java b/src/main/java/edu/harvard/iq/dataverse/ThemeWidgetFragment.java index e270d3842f6..9a62a99722a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ThemeWidgetFragment.java +++ b/src/main/java/edu/harvard/iq/dataverse/ThemeWidgetFragment.java @@ -18,16 +18,16 @@ import java.nio.file.StandardCopyOption; import java.util.logging.Level; import java.util.logging.Logger; -import javax.annotation.PreDestroy; -import javax.ejb.EJB; -import javax.faces.application.FacesMessage; -import javax.faces.component.UIComponent; -import javax.faces.component.html.HtmlInputText; -import javax.faces.context.FacesContext; -import javax.faces.validator.ValidatorException; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.annotation.PreDestroy; +import jakarta.ejb.EJB; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.component.UIComponent; +import jakarta.faces.component.html.HtmlInputText; +import jakarta.faces.context.FacesContext; +import jakarta.faces.validator.ValidatorException; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; import org.apache.commons.lang3.StringUtils; import org.primefaces.PrimeFaces; diff --git a/src/main/java/edu/harvard/iq/dataverse/ThumbnailServiceWrapper.java b/src/main/java/edu/harvard/iq/dataverse/ThumbnailServiceWrapper.java index 6c8db8c124b..319ae06eefb 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ThumbnailServiceWrapper.java +++ b/src/main/java/edu/harvard/iq/dataverse/ThumbnailServiceWrapper.java @@ -8,24 +8,21 @@ import edu.harvard.iq.dataverse.dataaccess.DataAccess; import edu.harvard.iq.dataverse.dataaccess.StorageIO; import edu.harvard.iq.dataverse.dataaccess.ImageThumbConverter; -import edu.harvard.iq.dataverse.dataset.DatasetUtil; + import static edu.harvard.iq.dataverse.dataset.DatasetUtil.datasetLogoThumbnail; import edu.harvard.iq.dataverse.search.SolrSearchResult; import edu.harvard.iq.dataverse.util.FileUtil; -import java.io.File; + import java.io.IOException; import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; import java.util.Base64; import java.util.HashMap; import java.util.Map; -import javax.ejb.EJB; -import javax.enterprise.context.RequestScoped; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.ejb.EJB; +import jakarta.enterprise.context.RequestScoped; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; import org.apache.commons.io.IOUtils; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/UserBannerMessage.java b/src/main/java/edu/harvard/iq/dataverse/UserBannerMessage.java index 7bd4f2d898f..888669ee615 100644 --- a/src/main/java/edu/harvard/iq/dataverse/UserBannerMessage.java +++ b/src/main/java/edu/harvard/iq/dataverse/UserBannerMessage.java @@ -4,15 +4,15 @@ import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import java.io.Serializable; 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.JoinColumn; -import javax.persistence.OneToOne; -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.JoinColumn; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Temporal; +import jakarta.persistence.TemporalType; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/UserNotification.java b/src/main/java/edu/harvard/iq/dataverse/UserNotification.java index b68a1b9d13e..a87404b69a7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/UserNotification.java +++ b/src/main/java/edu/harvard/iq/dataverse/UserNotification.java @@ -12,17 +12,17 @@ import java.util.Collections; import java.util.HashSet; import java.util.stream.Collectors; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; -import javax.persistence.Transient; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/UserNotificationServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/UserNotificationServiceBean.java index 947ee3ce989..a2a71ff8b40 100644 --- a/src/main/java/edu/harvard/iq/dataverse/UserNotificationServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/UserNotificationServiceBean.java @@ -14,16 +14,16 @@ import java.sql.Timestamp; import java.util.List; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.ejb.TransactionAttribute; -import javax.ejb.TransactionAttributeType; -import javax.inject.Inject; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.ejb.TransactionAttribute; +import jakarta.ejb.TransactionAttributeType; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/UserServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/UserServiceBean.java index 2d8ecf64f76..56633a34339 100644 --- a/src/main/java/edu/harvard/iq/dataverse/UserServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/UserServiceBean.java @@ -12,14 +12,14 @@ import java.util.Date; import java.util.logging.Logger; import java.util.stream.Collectors; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.ejb.TransactionAttribute; -import javax.ejb.TransactionAttributeType; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.ejb.TransactionAttribute; +import jakarta.ejb.TransactionAttributeType; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; import org.apache.commons.lang3.StringUtils; import org.ocpsoft.common.util.Strings; diff --git a/src/main/java/edu/harvard/iq/dataverse/ValidateDataFileDirectoryName.java b/src/main/java/edu/harvard/iq/dataverse/ValidateDataFileDirectoryName.java index 94e33d6220a..9e8ce42491d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ValidateDataFileDirectoryName.java +++ b/src/main/java/edu/harvard/iq/dataverse/ValidateDataFileDirectoryName.java @@ -10,8 +10,8 @@ import java.lang.annotation.Retention; import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Target; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/ValidateDatasetFieldType.java b/src/main/java/edu/harvard/iq/dataverse/ValidateDatasetFieldType.java index ae7b4a1eaef..f36a1d9541e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ValidateDatasetFieldType.java +++ b/src/main/java/edu/harvard/iq/dataverse/ValidateDatasetFieldType.java @@ -13,8 +13,8 @@ import java.lang.annotation.Retention; import java.lang.annotation.Target; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; @Target({TYPE, ANNOTATION_TYPE}) @Retention(RUNTIME) diff --git a/src/main/java/edu/harvard/iq/dataverse/ValidateTermsOfUseAndAccess.java b/src/main/java/edu/harvard/iq/dataverse/ValidateTermsOfUseAndAccess.java index 8717d10fc8d..f55e93af674 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ValidateTermsOfUseAndAccess.java +++ b/src/main/java/edu/harvard/iq/dataverse/ValidateTermsOfUseAndAccess.java @@ -10,8 +10,8 @@ import java.lang.annotation.Retention; import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Target; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/ValidateVersionNote.java b/src/main/java/edu/harvard/iq/dataverse/ValidateVersionNote.java index 405a7feb52f..c8d64d4a642 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ValidateVersionNote.java +++ b/src/main/java/edu/harvard/iq/dataverse/ValidateVersionNote.java @@ -11,8 +11,8 @@ import java.lang.annotation.Retention; import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Target; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/WidgetWrapper.java b/src/main/java/edu/harvard/iq/dataverse/WidgetWrapper.java index 743d8f2d092..a8ea5fabde4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/WidgetWrapper.java +++ b/src/main/java/edu/harvard/iq/dataverse/WidgetWrapper.java @@ -5,10 +5,10 @@ */ package edu.harvard.iq.dataverse; -import javax.faces.context.FacesContext; -import javax.faces.view.ViewScoped; -import javax.inject.Named; -import javax.servlet.http.HttpServletResponse; +import jakarta.faces.context.FacesContext; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Named; +import jakarta.servlet.http.HttpServletResponse; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/actionlogging/ActionLogRecord.java b/src/main/java/edu/harvard/iq/dataverse/actionlogging/ActionLogRecord.java index 31a9ad25e5b..6743c3f2143 100644 --- a/src/main/java/edu/harvard/iq/dataverse/actionlogging/ActionLogRecord.java +++ b/src/main/java/edu/harvard/iq/dataverse/actionlogging/ActionLogRecord.java @@ -3,16 +3,16 @@ import java.util.Date; import java.util.Objects; import java.util.UUID; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.PrePersist; -import javax.persistence.Table; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.PrePersist; +import jakarta.persistence.Table; +import jakarta.persistence.Temporal; +import jakarta.persistence.TemporalType; /** * Logs a single action in the action log. diff --git a/src/main/java/edu/harvard/iq/dataverse/actionlogging/ActionLogServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/actionlogging/ActionLogServiceBean.java index ba19fdd9eeb..2d16f52bb09 100644 --- a/src/main/java/edu/harvard/iq/dataverse/actionlogging/ActionLogServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/actionlogging/ActionLogServiceBean.java @@ -1,11 +1,11 @@ package edu.harvard.iq.dataverse.actionlogging; import java.util.Date; -import javax.ejb.Stateless; -import javax.ejb.TransactionAttribute; -import javax.ejb.TransactionAttributeType; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; +import jakarta.ejb.Stateless; +import jakarta.ejb.TransactionAttribute; +import jakarta.ejb.TransactionAttributeType; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; /** * A service bean that persists {@link ActionLogRecord}s to the DB. diff --git a/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java b/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java index 6b3e27becb7..5a4c9ab9058 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java @@ -57,24 +57,24 @@ import java.util.concurrent.Callable; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.JsonReader; -import javax.json.JsonValue; -import javax.json.JsonValue.ValueType; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.PersistenceContext; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.core.*; -import javax.ws.rs.core.Response.ResponseBuilder; -import javax.ws.rs.core.Response.Status; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonReader; +import jakarta.json.JsonValue; +import jakarta.json.JsonValue.ValueType; +import jakarta.persistence.EntityManager; +import jakarta.persistence.NoResultException; +import jakarta.persistence.PersistenceContext; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.core.*; +import jakarta.ws.rs.core.Response.ResponseBuilder; +import jakarta.ws.rs.core.Response.Status; import static org.apache.commons.lang3.StringUtils.isNumeric; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Access.java b/src/main/java/edu/harvard/iq/dataverse/api/Access.java index 02441a9ee11..0341f8c1127 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Access.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Access.java @@ -31,7 +31,7 @@ import edu.harvard.iq.dataverse.RoleAssignment; import edu.harvard.iq.dataverse.UserNotification; import edu.harvard.iq.dataverse.UserNotificationServiceBean; -import static edu.harvard.iq.dataverse.api.AbstractApiBean.error; + import static edu.harvard.iq.dataverse.api.Datasets.handleVersion; import edu.harvard.iq.dataverse.api.auth.AuthRequired; @@ -73,7 +73,7 @@ import edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder; import java.util.logging.Logger; -import javax.ejb.EJB; +import jakarta.ejb.EJB; import java.io.InputStream; import java.io.ByteArrayOutputStream; import java.io.File; @@ -88,47 +88,46 @@ import java.util.List; import java.util.Properties; import java.util.logging.Level; -import javax.inject.Inject; -import javax.json.Json; +import jakarta.inject.Inject; +import jakarta.json.Json; import java.net.URI; -import javax.json.JsonArrayBuilder; -import javax.persistence.TypedQuery; - -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; - -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.UriInfo; - - -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.BadRequestException; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.ForbiddenException; -import javax.ws.rs.NotFoundException; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.QueryParam; -import javax.ws.rs.ServiceUnavailableException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Response; -import static javax.ws.rs.core.Response.Status.BAD_REQUEST; -import javax.ws.rs.core.StreamingOutput; +import jakarta.json.JsonArrayBuilder; +import jakarta.persistence.TypedQuery; + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; + +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.UriInfo; + + +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.BadRequestException; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.ForbiddenException; +import jakarta.ws.rs.NotFoundException; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.ServiceUnavailableException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Response; +import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; +import jakarta.ws.rs.core.StreamingOutput; import static edu.harvard.iq.dataverse.util.json.JsonPrinter.json; import java.net.URISyntaxException; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import javax.json.JsonObjectBuilder; -import javax.ws.rs.RedirectionException; -import javax.ws.rs.ServerErrorException; -import javax.ws.rs.core.MediaType; -import static javax.ws.rs.core.Response.Status.FORBIDDEN; -import static javax.ws.rs.core.Response.Status.UNAUTHORIZED; + +import jakarta.json.JsonObjectBuilder; +import jakarta.ws.rs.RedirectionException; +import jakarta.ws.rs.ServerErrorException; +import jakarta.ws.rs.core.MediaType; +import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; +import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; import org.glassfish.jersey.media.multipart.FormDataBodyPart; import org.glassfish.jersey.media.multipart.FormDataParam; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Admin.java b/src/main/java/edu/harvard/iq/dataverse/api/Admin.java index b11a78c2416..1efb29d8616 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Admin.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Admin.java @@ -18,7 +18,6 @@ import edu.harvard.iq.dataverse.settings.JvmSettings; import edu.harvard.iq.dataverse.validation.EMailValidator; import edu.harvard.iq.dataverse.EjbDataverseEngine; -import edu.harvard.iq.dataverse.GlobalId; import edu.harvard.iq.dataverse.HandlenetServiceBean; import edu.harvard.iq.dataverse.Template; import edu.harvard.iq.dataverse.TemplateServiceBean; @@ -48,19 +47,19 @@ import edu.harvard.iq.dataverse.engine.command.impl.AbstractSubmitToArchiveCommand; import edu.harvard.iq.dataverse.engine.command.impl.PublishDataverseCommand; import edu.harvard.iq.dataverse.settings.Setting; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObjectBuilder; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Response; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObjectBuilder; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.Response; import static edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder.jsonObjectBuilder; import java.io.InputStream; @@ -69,14 +68,14 @@ import java.util.Map.Entry; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.json.JsonObject; -import javax.json.JsonReader; -import javax.validation.ConstraintViolation; -import javax.validation.ConstraintViolationException; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Response.Status; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.Response.Status; import org.apache.commons.io.IOUtils; @@ -117,12 +116,12 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Date; -import javax.inject.Inject; -import javax.json.JsonArray; -import javax.persistence.Query; -import javax.ws.rs.QueryParam; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.StreamingOutput; +import jakarta.inject.Inject; +import jakarta.json.JsonArray; +import jakarta.persistence.Query; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.StreamingOutput; /** * Where the secure, setup API calls live. diff --git a/src/main/java/edu/harvard/iq/dataverse/api/ApiBlockingFilter.java b/src/main/java/edu/harvard/iq/dataverse/api/ApiBlockingFilter.java index 6bf852d25f7..19f4732f79a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/ApiBlockingFilter.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/ApiBlockingFilter.java @@ -10,21 +10,21 @@ import java.util.TreeSet; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.ejb.EJB; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; /** * A web filter to block API administration calls. * @author michael */ -public class ApiBlockingFilter implements javax.servlet.Filter { +public class ApiBlockingFilter implements jakarta.servlet.Filter { public static final String UNBLOCK_KEY_QUERYPARAM = "unblock-key"; interface BlockPolicy { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/ApiConfiguration.java b/src/main/java/edu/harvard/iq/dataverse/api/ApiConfiguration.java index f9ba088a4e9..d076ab8f973 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/ApiConfiguration.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/ApiConfiguration.java @@ -1,6 +1,6 @@ package edu.harvard.iq.dataverse.api; -import javax.ws.rs.ApplicationPath; +import jakarta.ws.rs.ApplicationPath; import edu.harvard.iq.dataverse.api.auth.AuthFilter; import org.glassfish.jersey.media.multipart.MultiPartFeature; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/ApiRouter.java b/src/main/java/edu/harvard/iq/dataverse/api/ApiRouter.java index 691afeaef20..acc66b2e12a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/ApiRouter.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/ApiRouter.java @@ -2,20 +2,20 @@ import java.io.IOException; import java.util.logging.Logger; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.RequestDispatcher; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.RequestDispatcher; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; /** * Routes API calls that don't have a version number to the latest API version * * @author michael */ -public class ApiRouter implements javax.servlet.Filter { +public class ApiRouter implements jakarta.servlet.Filter { private static final Logger logger = Logger.getLogger(ApiRouter.class.getName()); @Override diff --git a/src/main/java/edu/harvard/iq/dataverse/api/BatchImport.java b/src/main/java/edu/harvard/iq/dataverse/api/BatchImport.java index bf9ce2adc5a..a2d06bff93e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/BatchImport.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/BatchImport.java @@ -15,16 +15,16 @@ import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import java.io.IOException; import java.io.PrintWriter; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.json.JsonObjectBuilder; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.QueryParam; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Response; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.json.JsonObjectBuilder; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.Response; @Stateless @Path("batch") diff --git a/src/main/java/edu/harvard/iq/dataverse/api/BatchServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/api/BatchServiceBean.java index 8fe58298481..daddc447117 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/BatchServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/BatchServiceBean.java @@ -14,12 +14,12 @@ import java.util.Date; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.Asynchronous; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObjectBuilder; +import jakarta.ejb.Asynchronous; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObjectBuilder; /** * EJB for kicking off big batch jobs asynchronously from the REST API (BatchImport.java) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/BuiltinUsers.java b/src/main/java/edu/harvard/iq/dataverse/api/BuiltinUsers.java index 9262cc6ef46..50862bc0d35 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/BuiltinUsers.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/BuiltinUsers.java @@ -13,25 +13,22 @@ import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import java.sql.Timestamp; -import java.util.Calendar; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.json.Json; -import javax.json.JsonObjectBuilder; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; import java.util.Date; import static edu.harvard.iq.dataverse.util.json.JsonPrinter.json; import static edu.harvard.iq.dataverse.util.json.JsonPrinter.json; -import static edu.harvard.iq.dataverse.util.json.JsonPrinter.json; -import static edu.harvard.iq.dataverse.util.json.JsonPrinter.json; /** * REST API bean for managing {@link BuiltinUser}s. diff --git a/src/main/java/edu/harvard/iq/dataverse/api/BundleDownloadInstanceWriter.java b/src/main/java/edu/harvard/iq/dataverse/api/BundleDownloadInstanceWriter.java index 7edb0ac838c..35f19375902 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/BundleDownloadInstanceWriter.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/BundleDownloadInstanceWriter.java @@ -12,14 +12,14 @@ import java.io.OutputStream; import java.io.IOException; -import javax.ws.rs.InternalServerErrorException; -import javax.ws.rs.NotFoundException; -import javax.ws.rs.WebApplicationException; - -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyWriter; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.InternalServerErrorException; +import jakarta.ws.rs.NotFoundException; +import jakarta.ws.rs.WebApplicationException; + +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyWriter; +import jakarta.ws.rs.ext.Provider; import edu.harvard.iq.dataverse.DataFile; import edu.harvard.iq.dataverse.dataaccess.*; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/DataTagsAPI.java b/src/main/java/edu/harvard/iq/dataverse/api/DataTagsAPI.java index 063033d4747..d7c8bd827d1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/DataTagsAPI.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/DataTagsAPI.java @@ -5,18 +5,18 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.json.JsonObject; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.json.JsonObject; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/api/DatasetFieldServiceApi.java b/src/main/java/edu/harvard/iq/dataverse/api/DatasetFieldServiceApi.java index 4ec728a8159..62babf3ae34 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/DatasetFieldServiceApi.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/DatasetFieldServiceApi.java @@ -20,18 +20,18 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.validation.ConstraintViolation; -import javax.validation.ConstraintViolationException; -import javax.ws.rs.Consumes; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.core.Response; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.core.Response; import edu.harvard.iq.dataverse.util.BundleUtil; import edu.harvard.iq.dataverse.util.ConstraintViolationUtil; @@ -41,9 +41,9 @@ import java.util.logging.Level; import java.util.logging.Logger; -import javax.persistence.NoResultException; -import javax.persistence.TypedQuery; -import javax.ws.rs.core.Response.Status; +import jakarta.persistence.NoResultException; +import jakarta.persistence.TypedQuery; +import jakarta.ws.rs.core.Response.Status; import java.io.BufferedInputStream; import java.io.FileOutputStream; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java index 8c1390b597e..1eb1bd74663 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -63,9 +63,7 @@ import edu.harvard.iq.dataverse.externaltools.ExternalToolHandler; import edu.harvard.iq.dataverse.ingest.IngestServiceBean; import edu.harvard.iq.dataverse.privateurl.PrivateUrl; -import edu.harvard.iq.dataverse.api.AbstractApiBean.WrappedResponse; import edu.harvard.iq.dataverse.api.dto.RoleAssignmentDTO; -import edu.harvard.iq.dataverse.batch.util.LoggingUtil; import edu.harvard.iq.dataverse.dataaccess.DataAccess; import edu.harvard.iq.dataverse.dataaccess.ImageThumbConverter; import edu.harvard.iq.dataverse.dataaccess.S3AccessIO; @@ -85,7 +83,6 @@ import edu.harvard.iq.dataverse.makedatacount.MakeDataCountUtil; import edu.harvard.iq.dataverse.privateurl.PrivateUrlServiceBean; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; -import edu.harvard.iq.dataverse.settings.SettingsServiceBean.Key; import edu.harvard.iq.dataverse.util.ArchiverUtil; import edu.harvard.iq.dataverse.util.BundleUtil; import edu.harvard.iq.dataverse.util.EjbUtil; @@ -96,7 +93,6 @@ import edu.harvard.iq.dataverse.util.json.JSONLDUtil; import edu.harvard.iq.dataverse.util.json.JsonLDTerm; import edu.harvard.iq.dataverse.util.json.JsonParseException; -import edu.harvard.iq.dataverse.util.json.JsonPrinter; import edu.harvard.iq.dataverse.util.SignpostingResources; import edu.harvard.iq.dataverse.util.json.JsonUtil; import edu.harvard.iq.dataverse.search.IndexServiceBean; @@ -131,32 +127,31 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.inject.Inject; -import javax.json.*; -import javax.json.stream.JsonParsingException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.BadRequestException; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.GET; -import javax.ws.rs.NotAcceptableException; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.core.*; -import javax.ws.rs.core.Response.Status; -import static javax.ws.rs.core.Response.Status.BAD_REQUEST; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.inject.Inject; +import jakarta.json.*; +import jakarta.json.stream.JsonParsingException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.BadRequestException; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.NotAcceptableException; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.core.*; +import jakarta.ws.rs.core.Response.Status; +import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; import org.apache.commons.lang3.StringUtils; -import org.apache.solr.client.solrj.SolrServerException; import org.glassfish.jersey.media.multipart.FormDataBodyPart; import org.glassfish.jersey.media.multipart.FormDataContentDisposition; import org.glassfish.jersey.media.multipart.FormDataParam; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java b/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java index bdab2818fbc..60a68591688 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java @@ -2,8 +2,6 @@ import edu.harvard.iq.dataverse.DataFile; import edu.harvard.iq.dataverse.Dataset; -import edu.harvard.iq.dataverse.DatasetAuthor; -import edu.harvard.iq.dataverse.DatasetField; import edu.harvard.iq.dataverse.DatasetFieldType; import edu.harvard.iq.dataverse.DatasetVersion; import edu.harvard.iq.dataverse.Dataverse; @@ -22,9 +20,7 @@ import edu.harvard.iq.dataverse.GuestbookServiceBean; import edu.harvard.iq.dataverse.MetadataBlock; import edu.harvard.iq.dataverse.RoleAssignment; -import edu.harvard.iq.dataverse.DatasetFieldType.FieldType; -import static edu.harvard.iq.dataverse.api.AbstractApiBean.error; import edu.harvard.iq.dataverse.api.dto.ExplicitGroupDTO; import edu.harvard.iq.dataverse.api.dto.RoleAssignmentDTO; import edu.harvard.iq.dataverse.api.dto.RoleDTO; @@ -36,7 +32,6 @@ import edu.harvard.iq.dataverse.authorization.groups.impl.explicit.ExplicitGroupProvider; import edu.harvard.iq.dataverse.authorization.groups.impl.explicit.ExplicitGroupServiceBean; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; -import edu.harvard.iq.dataverse.authorization.users.PrivateUrlUser; import edu.harvard.iq.dataverse.authorization.users.User; import edu.harvard.iq.dataverse.dataverse.DataverseUtil; import edu.harvard.iq.dataverse.engine.command.DataverseRequest; @@ -91,33 +86,33 @@ import java.util.TreeSet; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.ejb.Stateless; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonNumber; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.JsonString; -import javax.json.JsonValue; -import javax.json.JsonValue.ValueType; -import javax.json.stream.JsonParsingException; -import javax.validation.ConstraintViolationException; -import javax.ws.rs.BadRequestException; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.ejb.Stateless; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonNumber; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; +import jakarta.json.JsonValue.ValueType; +import jakarta.json.stream.JsonParsingException; +import jakarta.validation.ConstraintViolationException; +import jakarta.ws.rs.BadRequestException; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; import static edu.harvard.iq.dataverse.util.json.JsonPrinter.toJsonArray; import static edu.harvard.iq.dataverse.util.json.JsonPrinter.json; import java.io.IOException; @@ -129,11 +124,11 @@ import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; -import javax.servlet.http.HttpServletResponse; -import javax.validation.constraints.NotNull; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.StreamingOutput; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotNull; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.StreamingOutput; import javax.xml.stream.XMLStreamException; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/api/DownloadInstance.java b/src/main/java/edu/harvard/iq/dataverse/api/DownloadInstance.java index c9eb3638b90..e9f869ad8b9 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/DownloadInstance.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/DownloadInstance.java @@ -14,9 +14,9 @@ import java.util.logging.Logger; import edu.harvard.iq.dataverse.dataaccess.OptionalAccessService; -import javax.faces.context.FacesContext; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.UriInfo; +import jakarta.faces.context.FacesContext; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.UriInfo; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/api/DownloadInstanceWriter.java b/src/main/java/edu/harvard/iq/dataverse/api/DownloadInstanceWriter.java index 2410da04072..af681234e82 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/DownloadInstanceWriter.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/DownloadInstanceWriter.java @@ -12,14 +12,14 @@ import java.io.OutputStream; import java.io.IOException; -import javax.ws.rs.WebApplicationException; +import jakarta.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.core.Response; -import javax.ws.rs.ext.MessageBodyWriter; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.ext.MessageBodyWriter; +import jakarta.ws.rs.ext.Provider; import edu.harvard.iq.dataverse.DataFile; import edu.harvard.iq.dataverse.dataaccess.*; @@ -43,12 +43,12 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -import javax.inject.Inject; -import javax.ws.rs.ClientErrorException; -import javax.ws.rs.NotFoundException; -import javax.ws.rs.RedirectionException; -import javax.ws.rs.ServiceUnavailableException; -import javax.ws.rs.core.HttpHeaders; +import jakarta.inject.Inject; +import jakarta.ws.rs.ClientErrorException; +import jakarta.ws.rs.NotFoundException; +import jakarta.ws.rs.RedirectionException; +import jakarta.ws.rs.ServiceUnavailableException; +import jakarta.ws.rs.core.HttpHeaders; import org.apache.tika.mime.MimeType; import org.apache.tika.mime.MimeTypeException; import org.apache.tika.mime.MimeTypes; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/EditDDI.java b/src/main/java/edu/harvard/iq/dataverse/api/EditDDI.java index 3960fe4e996..15fe3ee31fe 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/EditDDI.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/EditDDI.java @@ -2,9 +2,7 @@ import edu.harvard.iq.dataverse.api.auth.AuthRequired; import edu.harvard.iq.dataverse.authorization.Permission; -import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.authorization.users.User; -import edu.harvard.iq.dataverse.batch.util.LoggingUtil; import edu.harvard.iq.dataverse.engine.command.DataverseRequest; import edu.harvard.iq.dataverse.engine.command.exception.CommandException; import edu.harvard.iq.dataverse.engine.command.impl.UpdateDatasetVersionCommand; @@ -28,28 +26,25 @@ import edu.harvard.iq.dataverse.datavariable.VariableCategory; import edu.harvard.iq.dataverse.datavariable.VariableMetadataDDIParser; import edu.harvard.iq.dataverse.search.IndexServiceBean; -import org.apache.solr.client.solrj.SolrServerException; - -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.ejb.Stateless; -import javax.inject.Inject; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Context; -import javax.ws.rs.Path; -import javax.ws.rs.PUT; -import javax.ws.rs.Consumes; -import javax.ws.rs.PathParam; + +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.ejb.Stateless; +import jakarta.inject.Inject; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.PathParam; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamReader; -import java.io.IOException; import java.io.InputStream; -import java.util.concurrent.Future; import java.util.logging.Level; import java.util.logging.Logger; import java.util.List; @@ -57,11 +52,9 @@ import java.util.Map; import java.util.HashMap; import java.util.Collection; -import java.util.Date; -import java.sql.Timestamp; -import javax.validation.ConstraintViolationException; +import jakarta.validation.ConstraintViolationException; @Stateless @Path("edit") diff --git a/src/main/java/edu/harvard/iq/dataverse/api/ExternalTools.java b/src/main/java/edu/harvard/iq/dataverse/api/ExternalTools.java index e53b54482b8..1feac1141bb 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/ExternalTools.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/ExternalTools.java @@ -4,15 +4,15 @@ import edu.harvard.iq.dataverse.externaltools.ExternalTool; import edu.harvard.iq.dataverse.externaltools.ExternalToolServiceBean; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.core.Response; -import static javax.ws.rs.core.Response.Status.BAD_REQUEST; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.core.Response; +import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; @Path("admin/externalTools") public class ExternalTools extends AbstractApiBean { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/FeedbackApi.java b/src/main/java/edu/harvard/iq/dataverse/api/FeedbackApi.java index 53829cf09cc..8a178f8da62 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/FeedbackApi.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/FeedbackApi.java @@ -11,17 +11,17 @@ import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import edu.harvard.iq.dataverse.util.MailUtil; -import javax.ejb.EJB; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonNumber; -import javax.json.JsonObject; -import javax.mail.internet.AddressException; -import javax.mail.internet.InternetAddress; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; +import jakarta.ejb.EJB; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonNumber; +import jakarta.json.JsonObject; +import jakarta.mail.internet.AddressException; +import jakarta.mail.internet.InternetAddress; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; @Path("admin/feedback") public class FeedbackApi extends AbstractApiBean { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Files.java b/src/main/java/edu/harvard/iq/dataverse/api/Files.java index f6eda085c95..3324523afbc 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Files.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Files.java @@ -55,26 +55,26 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.inject.Inject; -import javax.json.Json; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.QueryParam; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import static javax.ws.rs.core.Response.Status.BAD_REQUEST; -import javax.ws.rs.core.UriInfo; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.inject.Inject; +import jakarta.json.Json; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; +import jakarta.ws.rs.core.UriInfo; import org.glassfish.jersey.media.multipart.FormDataBodyPart; import org.glassfish.jersey.media.multipart.FormDataContentDisposition; import org.glassfish.jersey.media.multipart.FormDataParam; @@ -448,7 +448,7 @@ public Response updateFileMetadata(@Context ContainerRequestContext crc, @FormDa return error(Response.Status.BAD_REQUEST, "An error has occurred attempting to update the requested DataFile. It is not part of the current version of the Dataset."); } - javax.json.JsonObject jsonObject = JsonUtil.getJsonObject(jsonData); + jakarta.json.JsonObject jsonObject = JsonUtil.getJsonObject(jsonData); String incomingLabel = jsonObject.getString("label", null); String incomingDirectoryLabel = jsonObject.getString("directoryLabel", null); String existingLabel = df.getFileMetadata().getLabel(); diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Groups.java b/src/main/java/edu/harvard/iq/dataverse/api/Groups.java index 5a587efadf3..d56a787c7ff 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Groups.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Groups.java @@ -9,26 +9,26 @@ import edu.harvard.iq.dataverse.util.json.JsonParseException; import edu.harvard.iq.dataverse.util.json.JsonParser; -import javax.ejb.Stateless; -import javax.interceptor.Interceptors; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.core.Response; +import jakarta.ejb.Stateless; +import jakarta.interceptor.Interceptors; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.core.Response; import static edu.harvard.iq.dataverse.util.json.JsonPrinter.*; import java.util.Optional; import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Pattern; -import javax.annotation.PostConstruct; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObject; -import javax.json.JsonString; -import javax.ws.rs.DELETE; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.PathParam; +import jakarta.annotation.PostConstruct; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; +import jakarta.json.JsonString; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.PathParam; import static org.apache.commons.lang3.StringUtils.isNumeric; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/api/HarvestingClients.java b/src/main/java/edu/harvard/iq/dataverse/api/HarvestingClients.java index e739b1520a0..d7eec9f5757 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/HarvestingClients.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/HarvestingClients.java @@ -1,7 +1,6 @@ package edu.harvard.iq.dataverse.api; import edu.harvard.iq.dataverse.Dataverse; -import edu.harvard.iq.dataverse.DataverseServiceBean; import edu.harvard.iq.dataverse.api.auth.AuthRequired; import edu.harvard.iq.dataverse.harvest.client.HarvestingClient; @@ -17,27 +16,27 @@ import edu.harvard.iq.dataverse.util.StringUtil; import edu.harvard.iq.dataverse.util.json.JsonParseException; import edu.harvard.iq.dataverse.util.json.JsonPrinter; -import javax.json.JsonObjectBuilder; +import jakarta.json.JsonObjectBuilder; import static edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder.jsonObjectBuilder; import java.io.IOException; import java.io.StringReader; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObject; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.QueryParam; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Response; +import jakarta.ejb.EJB; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.Response; @Path("harvest/clients") public class HarvestingClients extends AbstractApiBean { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/HarvestingServer.java b/src/main/java/edu/harvard/iq/dataverse/api/HarvestingServer.java index f5e3e669083..308b910c425 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/HarvestingServer.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/HarvestingServer.java @@ -11,29 +11,29 @@ import edu.harvard.iq.dataverse.harvest.server.OAISetServiceBean; import edu.harvard.iq.dataverse.util.BundleUtil; import edu.harvard.iq.dataverse.util.json.JsonParseException; -import javax.json.JsonObjectBuilder; +import jakarta.json.JsonObjectBuilder; import static edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder.jsonObjectBuilder; import java.io.IOException; import java.io.StringReader; import java.util.List; import java.util.logging.Logger; import java.util.regex.Pattern; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.json.Json; -import javax.json.JsonReader; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObject; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.QueryParam; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Response; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.json.Json; +import jakarta.json.JsonReader; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.Response; import org.apache.commons.lang3.StringUtils; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Index.java b/src/main/java/edu/harvard/iq/dataverse/api/Index.java index 1361de8fbf7..1f03d91b324 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Index.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Index.java @@ -47,26 +47,24 @@ import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.validation.ConstraintViolation; -import javax.validation.ConstraintViolationException; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.QueryParam; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; import org.apache.solr.client.solrj.SolrServerException; @Path("admin/index") diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Info.java b/src/main/java/edu/harvard/iq/dataverse/api/Info.java index cfee582f69d..3349c34dfcc 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Info.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Info.java @@ -4,14 +4,14 @@ import edu.harvard.iq.dataverse.settings.JvmSettings; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import edu.harvard.iq.dataverse.util.SystemConfig; -import javax.ejb.EJB; -import javax.json.Json; -import javax.json.JsonValue; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Response; +import jakarta.ejb.EJB; +import jakarta.json.Json; +import jakarta.json.JsonValue; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.Response; @Path("info") public class Info extends AbstractApiBean { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java b/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java index 3b725468161..05d12f1083c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java @@ -28,20 +28,20 @@ import java.sql.Timestamp; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonValue; -import javax.json.JsonWriter; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.BadRequestException; -import javax.ws.rs.ServiceUnavailableException; -import javax.ws.rs.Consumes; -import javax.ws.rs.ForbiddenException; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Response; +import jakarta.ejb.EJB; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonValue; +import jakarta.json.JsonWriter; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.BadRequestException; +import jakarta.ws.rs.ServiceUnavailableException; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.ForbiddenException; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.Response; @Path("inbox") public class LDNInbox extends AbstractApiBean { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Licenses.java b/src/main/java/edu/harvard/iq/dataverse/api/Licenses.java index a9d7eb8024c..ab50ebbf2e4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Licenses.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Licenses.java @@ -2,20 +2,20 @@ import edu.harvard.iq.dataverse.actionlogging.ActionLogRecord; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Response; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.Response; import java.util.logging.Logger; -import javax.ejb.Stateless; -import javax.ws.rs.core.Response.Status; +import jakarta.ejb.Stateless; +import jakarta.ws.rs.core.Response.Status; import edu.harvard.iq.dataverse.api.auth.AuthRequired; import edu.harvard.iq.dataverse.authorization.users.User; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Logout.java b/src/main/java/edu/harvard/iq/dataverse/api/Logout.java index d6d8d5cdc44..e8d8be04459 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Logout.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Logout.java @@ -4,10 +4,10 @@ import edu.harvard.iq.dataverse.DataverseSession; import edu.harvard.iq.dataverse.settings.FeatureFlags; -import javax.inject.Inject; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.core.Response; +import jakarta.inject.Inject; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.core.Response; @Path("logout") public class Logout extends AbstractApiBean { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Mail.java b/src/main/java/edu/harvard/iq/dataverse/api/Mail.java index 3b5050b480b..5fac2f30c89 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Mail.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Mail.java @@ -2,10 +2,10 @@ import edu.harvard.iq.dataverse.MailServiceBean; import edu.harvard.iq.dataverse.actionlogging.ActionLogRecord; -import javax.ejb.EJB; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.core.Response; +import jakarta.ejb.EJB; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.core.Response; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/api/MakeDataCountApi.java b/src/main/java/edu/harvard/iq/dataverse/api/MakeDataCountApi.java index 0193c7774f1..6b48dbf8415 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/MakeDataCountApi.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/MakeDataCountApi.java @@ -18,19 +18,19 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.JsonValue; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; +import jakarta.ejb.EJB; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonValue; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; /** * Note that there are makeDataCount endpoints in Datasets.java as well. diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Meta.java b/src/main/java/edu/harvard/iq/dataverse/api/Meta.java index 1ca97f2ec69..a38840ba50d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Meta.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Meta.java @@ -15,19 +15,19 @@ import edu.harvard.iq.dataverse.export.DDIExportServiceBean; import java.util.logging.Logger; -import javax.ejb.EJB; +import jakarta.ejb.EJB; import java.io.ByteArrayOutputStream; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.QueryParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.HttpHeaders; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.NotFoundException; -import javax.ws.rs.ServiceUnavailableException; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.NotFoundException; +import jakarta.ws.rs.ServiceUnavailableException; /* Custom API exceptions [NOT YET IMPLEMENTED] diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Metadata.java b/src/main/java/edu/harvard/iq/dataverse/api/Metadata.java index b0d82b69d1b..bd937878286 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Metadata.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Metadata.java @@ -8,22 +8,17 @@ import edu.harvard.iq.dataverse.Dataset; import edu.harvard.iq.dataverse.DatasetServiceBean; -import java.io.IOException; -import java.util.concurrent.Future; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObjectBuilder; -import javax.ws.rs.*; -import javax.ws.rs.core.Response; +import jakarta.ejb.EJB; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObjectBuilder; +import jakarta.ws.rs.*; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.core.Response; -import edu.harvard.iq.dataverse.DatasetVersion; import edu.harvard.iq.dataverse.harvest.server.OAISetServiceBean; import edu.harvard.iq.dataverse.harvest.server.OAISet; -import org.apache.solr.client.solrj.SolrServerException; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/api/MetadataBlocks.java b/src/main/java/edu/harvard/iq/dataverse/api/MetadataBlocks.java index b3e1dad13af..448fb48e389 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/MetadataBlocks.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/MetadataBlocks.java @@ -1,12 +1,12 @@ package edu.harvard.iq.dataverse.api; import edu.harvard.iq.dataverse.MetadataBlock; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.Response; import static edu.harvard.iq.dataverse.util.json.JsonPrinter.brief; -import javax.ws.rs.PathParam; +import jakarta.ws.rs.PathParam; import static edu.harvard.iq.dataverse.util.json.JsonPrinter.json; import static edu.harvard.iq.dataverse.util.json.JsonPrinter.toJsonArray; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Metrics.java b/src/main/java/edu/harvard/iq/dataverse/api/Metrics.java index e966fd200d5..7bb2570334b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Metrics.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Metrics.java @@ -12,22 +12,22 @@ import java.util.List; import java.util.logging.Logger; -import javax.json.JsonArray; -import javax.json.JsonObject; -import javax.ws.rs.GET; -import javax.ws.rs.NotFoundException; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Request; -import javax.ws.rs.core.Response; - -import static javax.ws.rs.core.Response.Status.BAD_REQUEST; -import javax.ws.rs.core.UriInfo; -import javax.ws.rs.core.Variant; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.NotFoundException; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Request; +import jakarta.ws.rs.core.Response; + +import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; +import jakarta.ws.rs.core.UriInfo; +import jakarta.ws.rs.core.Variant; /** * API endpoints for various metrics. diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Notifications.java b/src/main/java/edu/harvard/iq/dataverse/api/Notifications.java index 006a95d85a5..37c894d3071 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Notifications.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Notifications.java @@ -11,19 +11,19 @@ import java.util.Optional; import java.util.Set; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObjectBuilder; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Response; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObjectBuilder; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.Response; import edu.harvard.iq.dataverse.util.MailUtil; import edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Pids.java b/src/main/java/edu/harvard/iq/dataverse/api/Pids.java index 2e6e97f7ced..534e42fd505 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Pids.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Pids.java @@ -10,24 +10,24 @@ import edu.harvard.iq.dataverse.settings.JvmSettings; import edu.harvard.iq.dataverse.util.BundleUtil; import java.util.Arrays; -import javax.ejb.Stateless; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObjectBuilder; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.InternalServerErrorException; -import javax.ws.rs.NotFoundException; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.ejb.Stateless; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObjectBuilder; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.InternalServerErrorException; +import jakarta.ws.rs.NotFoundException; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; /** * PIDs are Persistent IDentifiers such as DOIs or Handles. diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Prov.java b/src/main/java/edu/harvard/iq/dataverse/api/Prov.java index f0f18f781f1..37b4792920f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Prov.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Prov.java @@ -15,23 +15,23 @@ import java.io.StringReader; import java.util.HashMap; import java.util.logging.Logger; -import javax.inject.Inject; -import javax.json.Json; -import javax.json.JsonException; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.QueryParam; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Response; -import static javax.ws.rs.core.Response.Status.BAD_REQUEST; -import static javax.ws.rs.core.Response.Status.FORBIDDEN; +import jakarta.inject.Inject; +import jakarta.json.Json; +import jakarta.json.JsonException; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.Response; +import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; +import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; @Path("files") public class Prov extends AbstractApiBean { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Roles.java b/src/main/java/edu/harvard/iq/dataverse/api/Roles.java index b7f9e4821e5..8812f95dea1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Roles.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Roles.java @@ -1,29 +1,26 @@ package edu.harvard.iq.dataverse.api; -import static edu.harvard.iq.dataverse.api.AbstractApiBean.error; - import edu.harvard.iq.dataverse.api.auth.AuthRequired; import edu.harvard.iq.dataverse.api.dto.RoleDTO; import edu.harvard.iq.dataverse.authorization.DataverseRole; import edu.harvard.iq.dataverse.authorization.Permission; -import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.authorization.users.User; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; import static edu.harvard.iq.dataverse.util.json.JsonPrinter.*; import edu.harvard.iq.dataverse.engine.command.impl.CreateRoleCommand; import edu.harvard.iq.dataverse.engine.command.impl.DeleteRoleCommand; import edu.harvard.iq.dataverse.util.BundleUtil; import java.util.Arrays; import java.util.List; -import javax.ejb.Stateless; -import javax.ws.rs.DELETE; -import javax.ws.rs.QueryParam; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Response; +import jakarta.ejb.Stateless; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.Response; /** * Util API for managing roles. Might not make it to the production version. diff --git a/src/main/java/edu/harvard/iq/dataverse/api/SavedSearches.java b/src/main/java/edu/harvard/iq/dataverse/api/SavedSearches.java index 7ead0d23711..5d0365d022e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/SavedSearches.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/SavedSearches.java @@ -11,23 +11,23 @@ import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; -import javax.ejb.EJBException; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.Response; -import static javax.ws.rs.core.Response.Status.BAD_REQUEST; -import static javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR; -import static javax.ws.rs.core.Response.Status.NOT_FOUND; +import jakarta.ejb.EJBException; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.Response; +import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; +import static jakarta.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR; +import static jakarta.ws.rs.core.Response.Status.NOT_FOUND; @Path("admin/savedsearches") public class SavedSearches extends AbstractApiBean { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Search.java b/src/main/java/edu/harvard/iq/dataverse/api/Search.java index d3c9d0a4cc6..c760534ca7b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Search.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Search.java @@ -24,19 +24,18 @@ import java.util.Arrays; import java.util.List; import java.util.Map; -import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObjectBuilder; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.QueryParam; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Response; +import jakarta.ejb.EJB; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObjectBuilder; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.Response; import org.apache.commons.lang3.StringUtils; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/api/SiteMap.java b/src/main/java/edu/harvard/iq/dataverse/api/SiteMap.java index 787c3380e5b..37d6a2aa3fe 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/SiteMap.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/SiteMap.java @@ -2,13 +2,13 @@ import edu.harvard.iq.dataverse.sitemap.SiteMapServiceBean; import edu.harvard.iq.dataverse.sitemap.SiteMapUtil; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; @Stateless @Path("admin/sitemap") diff --git a/src/main/java/edu/harvard/iq/dataverse/api/StorageSites.java b/src/main/java/edu/harvard/iq/dataverse/api/StorageSites.java index 54adeecd9f9..2915328428e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/StorageSites.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/StorageSites.java @@ -3,16 +3,16 @@ import edu.harvard.iq.dataverse.locality.StorageSite; import edu.harvard.iq.dataverse.locality.StorageSiteUtil; import java.util.List; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObject; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.core.Response; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.core.Response; @Path("admin/storageSites") public class StorageSites extends AbstractApiBean { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/TestApi.java b/src/main/java/edu/harvard/iq/dataverse/api/TestApi.java index 42caa95b9f5..87be1f14e05 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/TestApi.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/TestApi.java @@ -2,20 +2,19 @@ import edu.harvard.iq.dataverse.DataFile; import edu.harvard.iq.dataverse.Dataset; -import static edu.harvard.iq.dataverse.api.AbstractApiBean.error; import edu.harvard.iq.dataverse.authorization.users.ApiToken; import edu.harvard.iq.dataverse.externaltools.ExternalTool; import edu.harvard.iq.dataverse.externaltools.ExternalToolHandler; import java.util.List; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObjectBuilder; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.Response; -import static javax.ws.rs.core.Response.Status.BAD_REQUEST; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObjectBuilder; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.Response; +import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; @Path("admin/test") public class TestApi extends AbstractApiBean { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/TestIngest.java b/src/main/java/edu/harvard/iq/dataverse/api/TestIngest.java index 15c3b34f6af..05ba150df8e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/TestIngest.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/TestIngest.java @@ -18,22 +18,22 @@ import edu.harvard.iq.dataverse.util.StringUtil; import java.io.BufferedInputStream; import java.util.logging.Logger; -import javax.ejb.EJB; +import jakarta.ejb.EJB; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.UriInfo; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.QueryParam; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.UriInfo; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.QueryParam; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Users.java b/src/main/java/edu/harvard/iq/dataverse/api/Users.java index 14bf25c91b2..791fc7aa774 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Users.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Users.java @@ -5,8 +5,6 @@ */ package edu.harvard.iq.dataverse.api; -import static edu.harvard.iq.dataverse.api.AbstractApiBean.error; - import edu.harvard.iq.dataverse.api.auth.AuthRequired; import edu.harvard.iq.dataverse.authorization.users.ApiToken; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; @@ -15,32 +13,30 @@ import edu.harvard.iq.dataverse.engine.command.impl.GetUserTracesCommand; import edu.harvard.iq.dataverse.engine.command.impl.MergeInAccountCommand; import edu.harvard.iq.dataverse.engine.command.impl.RevokeAllRolesCommand; -import edu.harvard.iq.dataverse.metrics.MetricsUtil; import edu.harvard.iq.dataverse.util.FileUtil; import static edu.harvard.iq.dataverse.util.json.JsonPrinter.json; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.Stateless; -import javax.json.JsonArray; -import javax.json.JsonObjectBuilder; -import javax.ws.rs.BadRequestException; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Request; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Variant; +import jakarta.ejb.Stateless; +import jakarta.json.JsonArray; +import jakarta.json.JsonObjectBuilder; +import jakarta.ws.rs.BadRequestException; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Request; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Variant; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Util.java b/src/main/java/edu/harvard/iq/dataverse/api/Util.java index 82adedc709f..25855769a38 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Util.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Util.java @@ -7,9 +7,9 @@ import java.util.TimeZone; import java.util.TreeSet; import java.util.stream.Collectors; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonReader; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonReader; public class Util { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Workflows.java b/src/main/java/edu/harvard/iq/dataverse/api/Workflows.java index 4269a0215bf..4eadcedf71a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Workflows.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Workflows.java @@ -8,11 +8,11 @@ import java.util.Arrays; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.core.Response; +import jakarta.ejb.EJB; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.core.Response; /** * API Endpoint for external systems to report the results of workflow step diff --git a/src/main/java/edu/harvard/iq/dataverse/api/WorkflowsAdmin.java b/src/main/java/edu/harvard/iq/dataverse/api/WorkflowsAdmin.java index 4babe6875e2..8d5024c1c14 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/WorkflowsAdmin.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/WorkflowsAdmin.java @@ -11,18 +11,18 @@ import edu.harvard.iq.dataverse.workflow.WorkflowServiceBean; import java.util.Arrays; import java.util.Optional; -import javax.ejb.EJB; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.JsonValue; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.core.Response; +import jakarta.ejb.EJB; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonValue; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.core.Response; /** * API Endpoint for managing workflows. diff --git a/src/main/java/edu/harvard/iq/dataverse/api/auth/ApiKeyAuthMechanism.java b/src/main/java/edu/harvard/iq/dataverse/api/auth/ApiKeyAuthMechanism.java index 60b75757f3c..0dd8a28baca 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/auth/ApiKeyAuthMechanism.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/auth/ApiKeyAuthMechanism.java @@ -7,8 +7,8 @@ import edu.harvard.iq.dataverse.authorization.users.User; import edu.harvard.iq.dataverse.privateurl.PrivateUrlServiceBean; -import javax.inject.Inject; -import javax.ws.rs.container.ContainerRequestContext; +import jakarta.inject.Inject; +import jakarta.ws.rs.container.ContainerRequestContext; import java.util.logging.Logger; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/api/auth/AuthFilter.java b/src/main/java/edu/harvard/iq/dataverse/api/auth/AuthFilter.java index dea9c571d22..34a72d718f0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/auth/AuthFilter.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/auth/AuthFilter.java @@ -3,12 +3,12 @@ import edu.harvard.iq.dataverse.api.ApiConstants; import edu.harvard.iq.dataverse.authorization.users.User; -import javax.annotation.Priority; -import javax.inject.Inject; -import javax.ws.rs.Priorities; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.container.ContainerRequestFilter; -import javax.ws.rs.ext.Provider; +import jakarta.annotation.Priority; +import jakarta.inject.Inject; +import jakarta.ws.rs.Priorities; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.container.ContainerRequestFilter; +import jakarta.ws.rs.ext.Provider; import java.io.IOException; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/api/auth/AuthMechanism.java b/src/main/java/edu/harvard/iq/dataverse/api/auth/AuthMechanism.java index e9bf1f39361..bd34acbf702 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/auth/AuthMechanism.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/auth/AuthMechanism.java @@ -2,7 +2,7 @@ import edu.harvard.iq.dataverse.authorization.users.User; -import javax.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.container.ContainerRequestContext; /** * @author Guillermo Portas diff --git a/src/main/java/edu/harvard/iq/dataverse/api/auth/AuthRequired.java b/src/main/java/edu/harvard/iq/dataverse/api/auth/AuthRequired.java index 4deacc7f66e..bf0d785eeb3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/auth/AuthRequired.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/auth/AuthRequired.java @@ -1,6 +1,6 @@ package edu.harvard.iq.dataverse.api.auth; -import javax.ws.rs.NameBinding; +import jakarta.ws.rs.NameBinding; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.Target; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/auth/BearerTokenAuthMechanism.java b/src/main/java/edu/harvard/iq/dataverse/api/auth/BearerTokenAuthMechanism.java index c4b03728179..b5a48427fa5 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/auth/BearerTokenAuthMechanism.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/auth/BearerTokenAuthMechanism.java @@ -11,9 +11,9 @@ import edu.harvard.iq.dataverse.authorization.users.User; import edu.harvard.iq.dataverse.settings.FeatureFlags; -import javax.inject.Inject; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.core.HttpHeaders; +import jakarta.inject.Inject; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.core.HttpHeaders; import java.io.IOException; import java.util.List; import java.util.Optional; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/auth/CompoundAuthMechanism.java b/src/main/java/edu/harvard/iq/dataverse/api/auth/CompoundAuthMechanism.java index 59384ff0336..801e2752b9e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/auth/CompoundAuthMechanism.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/auth/CompoundAuthMechanism.java @@ -3,8 +3,8 @@ import edu.harvard.iq.dataverse.authorization.users.GuestUser; import edu.harvard.iq.dataverse.authorization.users.User; -import javax.inject.Inject; -import javax.ws.rs.container.ContainerRequestContext; +import jakarta.inject.Inject; +import jakarta.ws.rs.container.ContainerRequestContext; import java.util.ArrayList; import java.util.Arrays; import java.util.List; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/auth/SessionCookieAuthMechanism.java b/src/main/java/edu/harvard/iq/dataverse/api/auth/SessionCookieAuthMechanism.java index 53aec9235a4..c1471c3f5b3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/auth/SessionCookieAuthMechanism.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/auth/SessionCookieAuthMechanism.java @@ -4,8 +4,8 @@ import edu.harvard.iq.dataverse.authorization.users.User; import edu.harvard.iq.dataverse.settings.FeatureFlags; -import javax.inject.Inject; -import javax.ws.rs.container.ContainerRequestContext; +import jakarta.inject.Inject; +import jakarta.ws.rs.container.ContainerRequestContext; public class SessionCookieAuthMechanism implements AuthMechanism { @Inject diff --git a/src/main/java/edu/harvard/iq/dataverse/api/auth/SignedUrlAuthMechanism.java b/src/main/java/edu/harvard/iq/dataverse/api/auth/SignedUrlAuthMechanism.java index caa58dfddf3..f8572144236 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/auth/SignedUrlAuthMechanism.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/auth/SignedUrlAuthMechanism.java @@ -7,9 +7,9 @@ import edu.harvard.iq.dataverse.settings.JvmSettings; import edu.harvard.iq.dataverse.util.UrlSignerUtil; -import javax.inject.Inject; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.core.UriInfo; +import jakarta.inject.Inject; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.core.UriInfo; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/auth/WorkflowKeyAuthMechanism.java b/src/main/java/edu/harvard/iq/dataverse/api/auth/WorkflowKeyAuthMechanism.java index e673e14e677..bbd67713e85 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/auth/WorkflowKeyAuthMechanism.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/auth/WorkflowKeyAuthMechanism.java @@ -4,8 +4,8 @@ import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.authorization.users.User; -import javax.inject.Inject; -import javax.ws.rs.container.ContainerRequestContext; +import jakarta.inject.Inject; +import jakarta.ws.rs.container.ContainerRequestContext; /** * @author Guillermo Portas diff --git a/src/main/java/edu/harvard/iq/dataverse/api/auth/WrappedAuthErrorResponse.java b/src/main/java/edu/harvard/iq/dataverse/api/auth/WrappedAuthErrorResponse.java index 18eafde6ede..40431557261 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/auth/WrappedAuthErrorResponse.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/auth/WrappedAuthErrorResponse.java @@ -3,8 +3,8 @@ import edu.harvard.iq.dataverse.api.ApiConstants; import edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; public class WrappedAuthErrorResponse extends Exception { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/batchjob/BatchJobResource.java b/src/main/java/edu/harvard/iq/dataverse/api/batchjob/BatchJobResource.java index 37c29f20efe..09a60b1b700 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/batchjob/BatchJobResource.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/batchjob/BatchJobResource.java @@ -4,17 +4,17 @@ import edu.harvard.iq.dataverse.api.AbstractApiBean; import edu.harvard.iq.dataverse.batch.entities.JobExecutionEntity; -import javax.batch.operations.JobOperator; -import javax.batch.runtime.BatchRuntime; -import javax.batch.runtime.JobExecution; -import javax.batch.runtime.JobInstance; -import javax.ejb.Stateless; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.batch.operations.JobOperator; +import jakarta.batch.runtime.BatchRuntime; +import jakarta.batch.runtime.JobExecution; +import jakarta.batch.runtime.JobInstance; +import jakarta.ejb.Stateless; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.util.ArrayList; import java.util.List; import java.util.Set; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/batchjob/FileRecordJobResource.java b/src/main/java/edu/harvard/iq/dataverse/api/batchjob/FileRecordJobResource.java index 8695c7dcab7..b7a6b7cfafd 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/batchjob/FileRecordJobResource.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/batchjob/FileRecordJobResource.java @@ -6,21 +6,21 @@ import edu.harvard.iq.dataverse.api.auth.AuthRequired; import edu.harvard.iq.dataverse.batch.jobs.importer.ImportMode; import edu.harvard.iq.dataverse.engine.command.impl.ImportFromFileSystemCommand; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonObject; +import jakarta.json.Json; +import jakarta.json.JsonObject; @Stateless @Path("batch/jobs") diff --git a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/CollectionDepositManagerImpl.java b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/CollectionDepositManagerImpl.java index 6543d771ebe..c306ba2fec2 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/CollectionDepositManagerImpl.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/CollectionDepositManagerImpl.java @@ -18,12 +18,12 @@ import edu.harvard.iq.dataverse.util.ConstraintViolationUtil; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.inject.Inject; -import javax.servlet.http.HttpServletRequest; -import javax.validation.ConstraintViolation; -import javax.validation.ConstraintViolationException; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.inject.Inject; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; import org.apache.abdera.parser.ParseException; import org.swordapp.server.AuthCredentials; import org.swordapp.server.CollectionDepositManager; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/CollectionListManagerImpl.java b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/CollectionListManagerImpl.java index c7ed00a23d0..084136f2b5d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/CollectionListManagerImpl.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/CollectionListManagerImpl.java @@ -11,9 +11,9 @@ import edu.harvard.iq.dataverse.engine.command.impl.UpdateDatasetVersionCommand; import java.util.List; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.inject.Inject; -import javax.servlet.http.HttpServletRequest; +import jakarta.ejb.EJB; +import jakarta.inject.Inject; +import jakarta.servlet.http.HttpServletRequest; import javax.xml.namespace.QName; import org.apache.abdera.Abdera; import org.apache.abdera.i18n.iri.IRI; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/ContainerManagerImpl.java b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/ContainerManagerImpl.java index b605f3717a8..4d4d1d08b51 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/ContainerManagerImpl.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/ContainerManagerImpl.java @@ -25,12 +25,12 @@ import java.util.List; import java.util.Map; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.inject.Inject; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.servlet.http.HttpServletRequest; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.inject.Inject; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.servlet.http.HttpServletRequest; import org.apache.abdera.parser.ParseException; import org.swordapp.server.AuthCredentials; import org.swordapp.server.ContainerManager; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/MediaResourceManagerImpl.java b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/MediaResourceManagerImpl.java index 482e35df781..93b7dc96563 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/MediaResourceManagerImpl.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/MediaResourceManagerImpl.java @@ -9,9 +9,6 @@ import edu.harvard.iq.dataverse.EjbDataverseEngine; import edu.harvard.iq.dataverse.PermissionServiceBean; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; -import edu.harvard.iq.dataverse.dataaccess.StorageIO; -import edu.harvard.iq.dataverse.datacapturemodule.DataCaptureModuleUtil; -import edu.harvard.iq.dataverse.datasetutility.FileExceedsMaxSizeException; import edu.harvard.iq.dataverse.engine.command.DataverseRequest; import edu.harvard.iq.dataverse.engine.command.exception.CommandException; import edu.harvard.iq.dataverse.engine.command.impl.UpdateDatasetVersionCommand; @@ -29,12 +26,12 @@ import java.util.Map; import java.util.Set; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.inject.Inject; -import javax.servlet.http.HttpServletRequest; -import javax.validation.ConstraintViolation; -import javax.validation.ConstraintViolationException; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.inject.Inject; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; import edu.harvard.iq.dataverse.util.file.CreateDataFileResult; import org.swordapp.server.AuthCredentials; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SWORDv2CollectionServlet.java b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SWORDv2CollectionServlet.java index a761afd1324..c509a8d6f52 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SWORDv2CollectionServlet.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SWORDv2CollectionServlet.java @@ -2,10 +2,10 @@ import java.io.IOException; import java.util.concurrent.locks.ReentrantLock; -import javax.inject.Inject; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.inject.Inject; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.swordapp.server.CollectionAPI; import org.swordapp.server.servlets.SwordServlet; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SWORDv2ContainerServlet.java b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SWORDv2ContainerServlet.java index 441186cc63f..53dce24c0fe 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SWORDv2ContainerServlet.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SWORDv2ContainerServlet.java @@ -2,10 +2,10 @@ import java.io.IOException; import java.util.concurrent.locks.ReentrantLock; -import javax.inject.Inject; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.inject.Inject; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.swordapp.server.ContainerAPI; import org.swordapp.server.ContainerManager; import org.swordapp.server.StatementManager; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SWORDv2MediaResourceServlet.java b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SWORDv2MediaResourceServlet.java index c455a6fd26a..245ab6ab23b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SWORDv2MediaResourceServlet.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SWORDv2MediaResourceServlet.java @@ -2,10 +2,10 @@ import java.io.IOException; import java.util.concurrent.locks.ReentrantLock; -import javax.inject.Inject; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.inject.Inject; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.swordapp.server.MediaResourceAPI; import org.swordapp.server.servlets.SwordServlet; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SWORDv2ServiceDocumentServlet.java b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SWORDv2ServiceDocumentServlet.java index 37db76d3c9c..eab005d87fa 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SWORDv2ServiceDocumentServlet.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SWORDv2ServiceDocumentServlet.java @@ -1,10 +1,10 @@ package edu.harvard.iq.dataverse.api.datadeposit; import java.io.IOException; -import javax.inject.Inject; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.inject.Inject; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.swordapp.server.ServiceDocumentAPI; import org.swordapp.server.servlets.SwordServlet; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SWORDv2StatementServlet.java b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SWORDv2StatementServlet.java index ed1202d8c77..4bcc9c6afe8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SWORDv2StatementServlet.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SWORDv2StatementServlet.java @@ -1,10 +1,10 @@ package edu.harvard.iq.dataverse.api.datadeposit; import java.io.IOException; -import javax.inject.Inject; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.inject.Inject; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.swordapp.server.StatementAPI; import org.swordapp.server.StatementManager; import org.swordapp.server.servlets.SwordServlet; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/ServiceDocumentManagerImpl.java b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/ServiceDocumentManagerImpl.java index 049b20f605b..134d54aef88 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/ServiceDocumentManagerImpl.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/ServiceDocumentManagerImpl.java @@ -8,8 +8,8 @@ import edu.harvard.iq.dataverse.util.SystemConfig; import java.util.List; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.inject.Inject; +import jakarta.ejb.EJB; +import jakarta.inject.Inject; import org.apache.commons.lang3.StringUtils; import org.swordapp.server.AuthCredentials; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/StatementManagerImpl.java b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/StatementManagerImpl.java index 05864fb2da0..95763e0eafb 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/StatementManagerImpl.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/StatementManagerImpl.java @@ -17,9 +17,9 @@ import java.util.Optional; import java.util.logging.Logger; import static java.util.stream.Collectors.joining; -import javax.ejb.EJB; -import javax.inject.Inject; -import javax.servlet.http.HttpServletRequest; +import jakarta.ejb.EJB; +import jakarta.inject.Inject; +import jakarta.servlet.http.HttpServletRequest; import org.apache.abdera.i18n.iri.IRI; import org.apache.abdera.i18n.iri.IRISyntaxException; import org.apache.abdera.model.AtomDate; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SwordConfigurationImpl.java b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SwordConfigurationImpl.java index 1e506c6a0b1..a5564e9fbdb 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SwordConfigurationImpl.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SwordConfigurationImpl.java @@ -6,7 +6,7 @@ import java.util.Arrays; import java.util.List; import java.util.logging.Logger; -import javax.ejb.EJB; +import jakarta.ejb.EJB; import org.swordapp.server.SwordConfiguration; public class SwordConfigurationImpl implements SwordConfiguration { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SwordServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SwordServiceBean.java index 2e093dbcf36..22b6ee05e48 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SwordServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SwordServiceBean.java @@ -19,10 +19,10 @@ import java.util.List; import java.util.Map; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Inject; +import jakarta.inject.Named; import org.apache.commons.lang3.StringUtils; import org.swordapp.server.SwordEntry; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/errorhandlers/ConstraintViolationExceptionHandler.java b/src/main/java/edu/harvard/iq/dataverse/api/errorhandlers/ConstraintViolationExceptionHandler.java index 4cbf31d1d2c..bb57059a99a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/errorhandlers/ConstraintViolationExceptionHandler.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/errorhandlers/ConstraintViolationExceptionHandler.java @@ -1,17 +1,15 @@ package edu.harvard.iq.dataverse.api.errorhandlers; -import edu.harvard.iq.dataverse.util.json.JsonPrinter; - -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObject; -import javax.validation.ConstraintViolation; -import javax.validation.ConstraintViolationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.ext.ExceptionMapper; -import javax.ws.rs.ext.Provider; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.ext.ExceptionMapper; +import jakarta.ws.rs.ext.Provider; import java.util.List; import java.util.stream.Collectors; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/errorhandlers/JsonParseExceptionHandler.java b/src/main/java/edu/harvard/iq/dataverse/api/errorhandlers/JsonParseExceptionHandler.java index 286272d9de3..2f974a1c5be 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/errorhandlers/JsonParseExceptionHandler.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/errorhandlers/JsonParseExceptionHandler.java @@ -2,17 +2,14 @@ import edu.harvard.iq.dataverse.util.json.JsonParseException; -import javax.json.Json; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.BadRequestException; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.ext.ExceptionMapper; -import javax.ws.rs.ext.Provider; -import java.util.UUID; -import java.util.logging.Level; -import java.util.logging.Logger; +import jakarta.json.Json; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.BadRequestException; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.ext.ExceptionMapper; +import jakarta.ws.rs.ext.Provider; /** * Make a failing JSON parsing request appear to be a BadRequest (error code 400) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/errorhandlers/ThrowableHandler.java b/src/main/java/edu/harvard/iq/dataverse/api/errorhandlers/ThrowableHandler.java index 4064ee21474..8e43a1876bf 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/errorhandlers/ThrowableHandler.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/errorhandlers/ThrowableHandler.java @@ -2,11 +2,11 @@ import edu.harvard.iq.dataverse.api.util.JsonResponseBuilder; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Response; -import javax.ws.rs.ext.ExceptionMapper; -import javax.ws.rs.ext.Provider; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.ext.ExceptionMapper; +import jakarta.ws.rs.ext.Provider; import java.util.Optional; import java.util.logging.Level; import java.util.logging.Logger; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/errorhandlers/WebApplicationExceptionHandler.java b/src/main/java/edu/harvard/iq/dataverse/api/errorhandlers/WebApplicationExceptionHandler.java index 5f28bfd0afc..e67e91e63c9 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/errorhandlers/WebApplicationExceptionHandler.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/errorhandlers/WebApplicationExceptionHandler.java @@ -8,12 +8,12 @@ import edu.harvard.iq.dataverse.api.util.JsonResponseBuilder; import edu.harvard.iq.dataverse.util.BundleUtil; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Response; -import javax.ws.rs.ext.ExceptionMapper; -import javax.ws.rs.ext.Provider; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.ext.ExceptionMapper; +import jakarta.ws.rs.ext.Provider; import java.util.Optional; import java.util.logging.Level; import java.util.logging.Logger; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/imports/CustomFieldMap.java b/src/main/java/edu/harvard/iq/dataverse/api/imports/CustomFieldMap.java index fc96215cef0..2bea36a6047 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/imports/CustomFieldMap.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/imports/CustomFieldMap.java @@ -7,14 +7,14 @@ package edu.harvard.iq.dataverse.api.imports; import java.io.Serializable; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.Table; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.Table; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/api/imports/CustomFieldServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/api/imports/CustomFieldServiceBean.java index e7b8e71495b..240baeefcff 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/imports/CustomFieldServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/imports/CustomFieldServiceBean.java @@ -5,9 +5,9 @@ */ package edu.harvard.iq.dataverse.api.imports; -import javax.ejb.Stateless; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; +import jakarta.ejb.Stateless; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/api/imports/ImportDDIServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/api/imports/ImportDDIServiceBean.java index 39b9ddbcf5f..8f7934dd528 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/imports/ImportDDIServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/imports/ImportDDIServiceBean.java @@ -22,15 +22,14 @@ import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.ejb.Stateless; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.ejb.Stateless; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLInputFactory; -import edu.harvard.iq.dataverse.util.json.ControlledVocabularyException; import org.apache.commons.lang3.StringUtils; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/api/imports/ImportGenericServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/api/imports/ImportGenericServiceBean.java index 57d7714ba77..f7a6cf54dd5 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/imports/ImportGenericServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/imports/ImportGenericServiceBean.java @@ -11,7 +11,6 @@ import edu.harvard.iq.dataverse.DatasetVersion; import edu.harvard.iq.dataverse.ForeignMetadataFieldMapping; import edu.harvard.iq.dataverse.ForeignMetadataFormatMapping; -import edu.harvard.iq.dataverse.GlobalId; import edu.harvard.iq.dataverse.HandlenetServiceBean; import edu.harvard.iq.dataverse.MetadataBlockServiceBean; import edu.harvard.iq.dataverse.api.dto.*; @@ -32,19 +31,19 @@ import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.json.Json; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.json.Json; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; -import javax.json.JsonObject; -import javax.json.JsonReader; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.PersistenceContext; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; +import jakarta.persistence.EntityManager; +import jakarta.persistence.NoResultException; +import jakarta.persistence.PersistenceContext; import javax.xml.stream.XMLInputFactory; import net.handle.hdllib.HandleException; import net.handle.hdllib.HandleResolver; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/imports/ImportServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/api/imports/ImportServiceBean.java index cb6cef6ded5..bcb67b180c8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/imports/ImportServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/imports/ImportServiceBean.java @@ -51,23 +51,23 @@ import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.ejb.Stateless; -import javax.ejb.TransactionAttribute; -import javax.ejb.TransactionAttributeType; -import static javax.ejb.TransactionAttributeType.REQUIRES_NEW; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.JsonReader; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.validation.ConstraintViolation; -import javax.validation.ConstraintViolationException; -import javax.validation.Validation; -import javax.validation.Validator; -import javax.validation.ValidatorFactory; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.ejb.Stateless; +import jakarta.ejb.TransactionAttribute; +import jakarta.ejb.TransactionAttributeType; +import static jakarta.ejb.TransactionAttributeType.REQUIRES_NEW; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonReader; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; import javax.xml.stream.XMLStreamException; import org.apache.commons.lang3.StringUtils; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/util/JsonResponseBuilder.java b/src/main/java/edu/harvard/iq/dataverse/api/util/JsonResponseBuilder.java index aef17d1ab34..71a010b7e6d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/util/JsonResponseBuilder.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/util/JsonResponseBuilder.java @@ -2,14 +2,14 @@ import edu.harvard.iq.dataverse.api.ApiBlockingFilter; -import javax.json.Json; -import javax.json.JsonValue; -import javax.json.JsonObjectBuilder; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.json.Json; +import jakarta.json.JsonValue; +import jakarta.json.JsonObjectBuilder; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import org.apache.commons.lang3.exception.ExceptionUtils; diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/AuthFilter.java b/src/main/java/edu/harvard/iq/dataverse/authorization/AuthFilter.java index 15d1cb07a11..a2cf3082ae7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/AuthFilter.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/AuthFilter.java @@ -8,14 +8,14 @@ import java.util.logging.Level; import java.util.logging.Logger; import java.util.logging.SimpleFormatter; -import javax.inject.Inject; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; +import jakarta.inject.Inject; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; public class AuthFilter implements Filter { diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/AuthTestDataServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/AuthTestDataServiceBean.java index 3715900733c..9cee3ec67c7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/AuthTestDataServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/AuthTestDataServiceBean.java @@ -15,7 +15,7 @@ import java.util.HashMap; import java.util.Map; import java.util.logging.Logger; -import javax.ejb.Stateless; +import jakarta.ejb.Stateless; import org.apache.commons.lang3.StringUtils; @Stateless diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticatedUserLookup.java b/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticatedUserLookup.java index 94a773bc977..3291dd2efbf 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticatedUserLookup.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticatedUserLookup.java @@ -2,17 +2,17 @@ import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import java.io.Serializable; -import javax.persistence.CascadeType; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.OneToOne; -import javax.persistence.Table; -import javax.persistence.UniqueConstraint; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; +import jakarta.persistence.UniqueConstraint; /** * A somewhat glorified key-value pair, persisted in the database. diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationProvidersRegistrationServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationProvidersRegistrationServiceBean.java index 6289865baf0..a93d01527a0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationProvidersRegistrationServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationProvidersRegistrationServiceBean.java @@ -22,15 +22,15 @@ import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; -import javax.annotation.PostConstruct; -import javax.ejb.EJB; -import javax.ejb.Lock; -import static javax.ejb.LockType.READ; -import static javax.ejb.LockType.WRITE; -import javax.ejb.Singleton; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; +import jakarta.annotation.PostConstruct; +import jakarta.ejb.EJB; +import jakarta.ejb.Lock; +import static jakarta.ejb.LockType.READ; +import static jakarta.ejb.LockType.WRITE; +import jakarta.ejb.Singleton; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationServiceBean.java index 9bf53116efa..106a83a4ad1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationServiceBean.java @@ -6,31 +6,23 @@ import edu.harvard.iq.dataverse.RoleAssigneeServiceBean; import edu.harvard.iq.dataverse.UserNotificationServiceBean; import edu.harvard.iq.dataverse.UserServiceBean; -import edu.harvard.iq.dataverse.authorization.providers.oauth2.oidc.OIDCAuthenticationProviderFactory; import edu.harvard.iq.dataverse.search.IndexServiceBean; import edu.harvard.iq.dataverse.actionlogging.ActionLogRecord; import edu.harvard.iq.dataverse.actionlogging.ActionLogServiceBean; import edu.harvard.iq.dataverse.authorization.exceptions.AuthenticationFailedException; -import edu.harvard.iq.dataverse.authorization.exceptions.AuthenticationProviderFactoryNotFoundException; -import edu.harvard.iq.dataverse.authorization.exceptions.AuthorizationSetupException; import edu.harvard.iq.dataverse.authorization.groups.impl.explicit.ExplicitGroup; import edu.harvard.iq.dataverse.authorization.groups.impl.explicit.ExplicitGroupServiceBean; import edu.harvard.iq.dataverse.authorization.providers.AuthenticationProviderFactory; -import edu.harvard.iq.dataverse.authorization.providers.AuthenticationProviderRow; import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinAuthenticationProvider; -import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinAuthenticationProviderFactory; import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinUser; import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinUserServiceBean; import edu.harvard.iq.dataverse.authorization.providers.builtin.PasswordEncryption; import edu.harvard.iq.dataverse.authorization.providers.oauth2.AbstractOAuth2AuthenticationProvider; -import edu.harvard.iq.dataverse.authorization.providers.oauth2.OAuth2AuthenticationProviderFactory; import edu.harvard.iq.dataverse.authorization.providers.shib.ShibAuthenticationProvider; -import edu.harvard.iq.dataverse.authorization.providers.shib.ShibAuthenticationProviderFactory; import edu.harvard.iq.dataverse.authorization.users.ApiToken; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.confirmemail.ConfirmEmailData; import edu.harvard.iq.dataverse.confirmemail.ConfirmEmailServiceBean; -import edu.harvard.iq.dataverse.engine.command.impl.RevokeAllRolesCommand; import edu.harvard.iq.dataverse.passwordreset.PasswordResetData; import edu.harvard.iq.dataverse.passwordreset.PasswordResetServiceBean; import edu.harvard.iq.dataverse.search.savedsearch.SavedSearchServiceBean; @@ -44,7 +36,6 @@ import java.util.Calendar; import java.util.Collection; import java.util.Date; -import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -53,21 +44,21 @@ import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; -import javax.annotation.PostConstruct; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.NonUniqueResultException; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import javax.persistence.TypedQuery; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; -import javax.validation.ValidatorFactory; +import jakarta.annotation.PostConstruct; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.NoResultException; +import jakarta.persistence.NonUniqueResultException; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; /** * AuthenticationService is for general authentication-related operations. diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/DataverseRole.java b/src/main/java/edu/harvard/iq/dataverse/authorization/DataverseRole.java index 12ddf817221..ff1a5546f38 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/DataverseRole.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/DataverseRole.java @@ -11,19 +11,19 @@ import java.util.MissingResourceException; import java.util.Objects; import java.util.Set; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.Table; -import javax.validation.constraints.Pattern; -import javax.validation.constraints.Size; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.Table; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; /** * A role is an annotated set of permissions. A role belongs diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/DataverseRolePermissionHelper.java b/src/main/java/edu/harvard/iq/dataverse/authorization/DataverseRolePermissionHelper.java index 4e6b54a8d49..966247bce2e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/DataverseRolePermissionHelper.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/DataverseRolePermissionHelper.java @@ -4,21 +4,17 @@ import edu.harvard.iq.dataverse.DataFile; import edu.harvard.iq.dataverse.Dataset; import edu.harvard.iq.dataverse.Dataverse; -import edu.harvard.iq.dataverse.DataverseRoleServiceBean; -import edu.harvard.iq.dataverse.authorization.DataverseRole; -import java.sql.Array; -import java.util.AbstractMap; + import java.util.ArrayList; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Named; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; import org.apache.commons.lang3.StringUtils; /* diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/GroupServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/GroupServiceBean.java index 66293a4f781..a746eee0a60 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/GroupServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/GroupServiceBean.java @@ -26,11 +26,11 @@ import java.util.logging.Logger; import static java.util.stream.Collectors.toSet; import java.util.stream.Stream; -import javax.annotation.PostConstruct; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.annotation.PostConstruct; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Inject; +import jakarta.inject.Named; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/PersistedGlobalGroup.java b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/PersistedGlobalGroup.java index 52785d5c7e2..1ef3b01d752 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/PersistedGlobalGroup.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/PersistedGlobalGroup.java @@ -3,14 +3,14 @@ import edu.harvard.iq.dataverse.authorization.groups.Group; import edu.harvard.iq.dataverse.authorization.RoleAssigneeDisplayInfo; import java.io.Serializable; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.Table; /** * Convenience base class for implementing groups that apply to the entire Dataverse diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/explicit/ExplicitGroup.java b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/explicit/ExplicitGroup.java index 43705a2240e..2723561d8b4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/explicit/ExplicitGroup.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/explicit/ExplicitGroup.java @@ -13,24 +13,24 @@ import java.util.Objects; import java.util.Set; import java.util.TreeSet; -import javax.persistence.Column; -import javax.persistence.ElementCollection; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.ManyToMany; -import javax.persistence.ManyToOne; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.PostLoad; -import javax.persistence.PrePersist; -import javax.persistence.Table; -import javax.persistence.Transient; -import javax.validation.constraints.Pattern; +import jakarta.persistence.Column; +import jakarta.persistence.ElementCollection; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.JoinTable; +import jakarta.persistence.ManyToMany; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.PostLoad; +import jakarta.persistence.PrePersist; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; +import jakarta.validation.constraints.Pattern; import org.hibernate.validator.constraints.NotBlank; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/explicit/ExplicitGroupServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/explicit/ExplicitGroupServiceBean.java index b7c1b46b3a7..a688fac0e34 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/explicit/ExplicitGroupServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/explicit/ExplicitGroupServiceBean.java @@ -10,17 +10,16 @@ import java.util.List; import java.util.Set; import java.util.TreeSet; -import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; import static java.util.stream.Collectors.joining; -import javax.annotation.PostConstruct; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.PersistenceContext; +import jakarta.annotation.PostConstruct; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.NoResultException; +import jakarta.persistence.PersistenceContext; /** * A bean providing the {@link ExplicitGroupProvider}s with container services, diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/IpGroup.java b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/IpGroup.java index a3231557898..038fbbfc6e0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/IpGroup.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/IpGroup.java @@ -12,12 +12,12 @@ import java.util.HashSet; import java.util.Objects; import java.util.Set; -import javax.persistence.CascadeType; -import javax.persistence.Entity; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.OneToMany; -import javax.persistence.Transient; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Entity; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Transient; @NamedQueries({ @NamedQuery(name="IpGroup.findAll", diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/IpGroupsServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/IpGroupsServiceBean.java index c03cf26e11e..15282045b3a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/IpGroupsServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/IpGroupsServiceBean.java @@ -10,12 +10,12 @@ import java.util.List; import java.util.Set; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.PersistenceContext; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.NoResultException; +import jakarta.persistence.PersistenceContext; /** * Provides CRUD tools to efficiently manage IP groups in a Java EE container. diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv4Range.java b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv4Range.java index 3ecd7689e1c..8694b7d455b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv4Range.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv4Range.java @@ -1,13 +1,13 @@ package edu.harvard.iq.dataverse.authorization.groups.impl.ipaddress.ip; import java.math.BigInteger; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.Table; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.Table; /** * A range of IPv4 addresses. In order to make SQL querying efficient, the actual fields diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv6Range.java b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv6Range.java index d1301d550c7..379c64a88cf 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv6Range.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv6Range.java @@ -1,13 +1,13 @@ package edu.harvard.iq.dataverse.authorization.groups.impl.ipaddress.ip; import java.io.Serializable; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.Table; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.Table; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IpAddressRange.java b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IpAddressRange.java index b71dbcd0eba..fc21397898f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IpAddressRange.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IpAddressRange.java @@ -2,8 +2,8 @@ import edu.harvard.iq.dataverse.authorization.groups.impl.ipaddress.IpGroup; import java.util.Objects; -import javax.persistence.ManyToOne; -import javax.persistence.MappedSuperclass; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.MappedSuperclass; /** * A range of {@link IpAddress}es. Abstract class - to instantiate, you need to diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/maildomain/MailDomainGroup.java b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/maildomain/MailDomainGroup.java index def11c57076..15b2fd1810c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/maildomain/MailDomainGroup.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/maildomain/MailDomainGroup.java @@ -6,11 +6,11 @@ import java.util.Arrays; import java.util.List; import java.util.Objects; -import javax.persistence.Entity; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.Transient; -import javax.validation.constraints.NotEmpty; +import jakarta.persistence.Entity; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.Transient; +import jakarta.validation.constraints.NotEmpty; ; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/maildomain/MailDomainGroupServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/maildomain/MailDomainGroupServiceBean.java index 58e72b7b575..b1b1e883705 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/maildomain/MailDomainGroupServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/maildomain/MailDomainGroupServiceBean.java @@ -9,14 +9,14 @@ import java.util.logging.Logger; import java.util.regex.Pattern; import java.util.stream.Collectors; -import javax.annotation.PostConstruct; -import javax.ejb.*; -import javax.inject.Inject; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.PersistenceContext; -import javax.ws.rs.NotFoundException; +import jakarta.annotation.PostConstruct; +import jakarta.ejb.*; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.NoResultException; +import jakarta.persistence.PersistenceContext; +import jakarta.ws.rs.NotFoundException; /** * A bean providing the {@link MailDomainGroupProvider}s with container services, such as database connectivity. diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/shib/ShibGroup.java b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/shib/ShibGroup.java index 79fda0ca7d7..30850f0fb20 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/shib/ShibGroup.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/shib/ShibGroup.java @@ -1,17 +1,16 @@ package edu.harvard.iq.dataverse.authorization.groups.impl.shib; -import edu.harvard.iq.dataverse.authorization.RoleAssignee; import edu.harvard.iq.dataverse.authorization.RoleAssigneeDisplayInfo; import edu.harvard.iq.dataverse.authorization.groups.Group; import edu.harvard.iq.dataverse.authorization.groups.GroupProvider; import edu.harvard.iq.dataverse.engine.command.DataverseRequest; import java.io.Serializable; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Transient; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Transient; /** * Persistence for Shibboleth groups. diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/shib/ShibGroupServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/shib/ShibGroupServiceBean.java index c15e56ee7e0..7a7844b7c1e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/shib/ShibGroupServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/shib/ShibGroupServiceBean.java @@ -11,14 +11,14 @@ import java.util.List; import java.util.Set; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.NonUniqueResultException; -import javax.persistence.PersistenceContext; -import javax.persistence.TypedQuery; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.NoResultException; +import jakarta.persistence.NonUniqueResultException; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.TypedQuery; /** * @todo Consider merging this bean into the newer and more generic diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/AuthenticationProviderRow.java b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/AuthenticationProviderRow.java index 6b9c545b7f9..2f37c777877 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/AuthenticationProviderRow.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/AuthenticationProviderRow.java @@ -2,13 +2,13 @@ import edu.harvard.iq.dataverse.authorization.AuthenticationProvider; import java.util.Objects; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.Lob; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.Table; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.Lob; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.Table; /** * Database-storable form of an {@code AuthenticationProvider}. diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/BuiltinUser.java b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/BuiltinUser.java index c2510b8b043..2ce36997ea9 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/BuiltinUser.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/BuiltinUser.java @@ -5,20 +5,20 @@ import edu.harvard.iq.dataverse.passwordreset.PasswordResetData; import java.io.Serializable; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.OneToOne; -import javax.persistence.Table; -import javax.persistence.Transient; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Size; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/BuiltinUserServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/BuiltinUserServiceBean.java index c39c7cb2985..a6cc22f44ca 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/BuiltinUserServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/BuiltinUserServiceBean.java @@ -9,17 +9,17 @@ import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.NonUniqueResultException; -import javax.persistence.PersistenceContext; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; -import javax.validation.ValidatorFactory; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.NoResultException; +import jakarta.persistence.NonUniqueResultException; +import jakarta.persistence.PersistenceContext; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; /** * @@ -88,7 +88,7 @@ public BuiltinUser findByUserName(String userName) { return em.createNamedQuery("BuiltinUser.findByUserName", BuiltinUser.class) .setParameter("userName", userName) .getSingleResult(); - } catch (javax.persistence.NoResultException e) { + } catch (jakarta.persistence.NoResultException e) { return null; } catch (NonUniqueResultException ex) { logger.log(Level.WARNING, "multiple accounts found for username {0}", userName); diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/DataverseUserPage.java b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/DataverseUserPage.java index 5c0f3a49f76..dc4644dfccd 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/DataverseUserPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/DataverseUserPage.java @@ -51,15 +51,15 @@ import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; -import javax.ejb.EJB; -import javax.faces.application.FacesMessage; -import javax.faces.component.UIComponent; -import javax.faces.component.UIInput; -import javax.faces.context.FacesContext; -import javax.faces.event.ActionEvent; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.ejb.EJB; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.component.UIComponent; +import jakarta.faces.component.UIInput; +import jakarta.faces.context.FacesContext; +import jakarta.faces.event.ActionEvent; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; import org.apache.commons.lang3.StringUtils; import org.hibernate.validator.constraints.NotBlank; diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/AbstractOAuth2AuthenticationProvider.java b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/AbstractOAuth2AuthenticationProvider.java index 01139cd2e27..48efe1e2592 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/AbstractOAuth2AuthenticationProvider.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/AbstractOAuth2AuthenticationProvider.java @@ -14,7 +14,7 @@ import edu.harvard.iq.dataverse.authorization.AuthenticationProviderDisplayInfo; import edu.harvard.iq.dataverse.util.BundleUtil; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotNull; import java.io.IOException; import java.util.*; import java.util.concurrent.ExecutionException; diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/OAuth2FirstLoginPage.java b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/OAuth2FirstLoginPage.java index 54ba3ec6a05..821e8a5ea6c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/OAuth2FirstLoginPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/OAuth2FirstLoginPage.java @@ -30,14 +30,14 @@ import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.enterprise.context.SessionScoped; -import javax.faces.application.FacesMessage; -import javax.faces.component.UIComponent; -import javax.faces.component.UIInput; -import javax.faces.context.FacesContext; -import javax.inject.Named; -import javax.inject.Inject; +import jakarta.ejb.EJB; +import jakarta.enterprise.context.SessionScoped; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.component.UIComponent; +import jakarta.faces.component.UIInput; +import jakarta.faces.context.FacesContext; +import jakarta.inject.Named; +import jakarta.inject.Inject; import org.hibernate.validator.constraints.NotBlank; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/OAuth2LoginBackingBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/OAuth2LoginBackingBean.java index c5be41a014a..99df2375a79 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/OAuth2LoginBackingBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/OAuth2LoginBackingBean.java @@ -20,12 +20,12 @@ import java.util.logging.Level; import java.util.logging.Logger; import static java.util.stream.Collectors.toList; -import javax.ejb.EJB; -import javax.inject.Named; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.servlet.http.HttpServletRequest; -import javax.validation.constraints.NotNull; +import jakarta.ejb.EJB; +import jakarta.inject.Named; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.constraints.NotNull; import static edu.harvard.iq.dataverse.util.StringUtil.toOption; import edu.harvard.iq.dataverse.util.SystemConfig; diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/OAuth2TokenData.java b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/OAuth2TokenData.java index a5ee5ddf537..59f659ff297 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/OAuth2TokenData.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/OAuth2TokenData.java @@ -4,14 +4,14 @@ import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import java.io.Serializable; import java.sql.Timestamp; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.ManyToOne; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; /** * Token data for a given user, received from an OAuth2 system. Contains the diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/OAuth2TokenDataServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/OAuth2TokenDataServiceBean.java index d8f1fa7600b..b1dcb6df8cc 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/OAuth2TokenDataServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/OAuth2TokenDataServiceBean.java @@ -2,10 +2,10 @@ import java.util.List; import java.util.Optional; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; /** * CRUD for {@link OAuth2TokenData}. diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/GitHubOAuth2AP.java b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/GitHubOAuth2AP.java index 62f3cc382e2..8829a25336b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/GitHubOAuth2AP.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/GitHubOAuth2AP.java @@ -9,9 +9,9 @@ import edu.harvard.iq.dataverse.util.BundleUtil; import java.io.StringReader; import java.util.Collections; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonReader; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; /** * IDP adaptor for GitHub.com diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/GoogleOAuth2AP.java b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/GoogleOAuth2AP.java index 1fa5470d551..a864ecb810a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/GoogleOAuth2AP.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/GoogleOAuth2AP.java @@ -8,9 +8,9 @@ import java.io.StringReader; import java.util.Arrays; import java.util.UUID; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonReader; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/MicrosoftOAuth2AP.java b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/MicrosoftOAuth2AP.java index da260a9fb0e..bd3caccc220 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/MicrosoftOAuth2AP.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/MicrosoftOAuth2AP.java @@ -8,9 +8,9 @@ import java.util.Collections; import java.util.logging.Logger; import java.io.StringReader; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonReader; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; import edu.harvard.iq.dataverse.authorization.AuthenticatedUserDisplayInfo; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/OrcidOAuth2AP.java b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/OrcidOAuth2AP.java index 02177ee0032..089ca40e164 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/OrcidOAuth2AP.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/OrcidOAuth2AP.java @@ -23,10 +23,10 @@ import static java.util.stream.Collectors.joining; import java.util.stream.IntStream; import java.util.stream.Stream; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonReader; -import javax.validation.constraints.NotNull; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; +import jakarta.validation.constraints.NotNull; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibServiceBean.java index 3e986a15689..0921b2c6683 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibServiceBean.java @@ -4,17 +4,11 @@ import com.google.gson.JsonElement; import com.google.gson.JsonParser; import edu.harvard.iq.dataverse.authorization.AuthTestDataServiceBean; -import edu.harvard.iq.dataverse.authorization.AuthenticationRequest; -import edu.harvard.iq.dataverse.authorization.AuthenticationResponse; import edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean; -import edu.harvard.iq.dataverse.authorization.exceptions.AuthenticationFailedException; -import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinAuthenticationProvider; import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinUser; import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinUserServiceBean; -import edu.harvard.iq.dataverse.authorization.providers.builtin.PasswordEncryption; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; -import edu.harvard.iq.dataverse.util.BundleUtil; import edu.harvard.iq.dataverse.util.SystemConfig; import java.io.IOException; import java.io.InputStream; @@ -25,11 +19,11 @@ import java.util.Map; import java.util.UUID; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.servlet.http.HttpServletRequest; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.servlet.http.HttpServletRequest; @Named @Stateless diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibUtil.java b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibUtil.java index f8b30710656..fff135e0dec 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibUtil.java @@ -12,7 +12,7 @@ import java.util.Map; import java.util.UUID; import java.util.logging.Logger; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; public class ShibUtil { diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/users/ApiToken.java b/src/main/java/edu/harvard/iq/dataverse/authorization/users/ApiToken.java index fc7ed8a9060..0de7d7754a1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/users/ApiToken.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/users/ApiToken.java @@ -2,18 +2,18 @@ import java.io.Serializable; import java.sql.Timestamp; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.Table; -import javax.validation.constraints.NotNull; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotNull; @Entity @NamedQueries({ diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUser.java b/src/main/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUser.java index 9fdfce2f1a7..89429b912f6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUser.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUser.java @@ -23,22 +23,22 @@ import java.util.Objects; import java.util.Set; -import javax.json.Json; -import javax.json.JsonObjectBuilder; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.OneToMany; -import javax.persistence.OneToOne; -import javax.persistence.PostLoad; -import javax.persistence.PrePersist; -import javax.persistence.Transient; -import javax.validation.constraints.NotNull; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OneToOne; +import jakarta.persistence.PostLoad; +import jakarta.persistence.PrePersist; +import jakarta.persistence.Transient; +import jakarta.validation.constraints.NotNull; import org.hibernate.validator.constraints.NotBlank; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/batch/entities/JobExecutionEntity.java b/src/main/java/edu/harvard/iq/dataverse/batch/entities/JobExecutionEntity.java index be2167fa4d5..debece131d3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/batch/entities/JobExecutionEntity.java +++ b/src/main/java/edu/harvard/iq/dataverse/batch/entities/JobExecutionEntity.java @@ -1,10 +1,10 @@ package edu.harvard.iq.dataverse.batch.entities; -import javax.batch.operations.JobOperator; -import javax.batch.runtime.BatchRuntime; -import javax.batch.runtime.BatchStatus; -import javax.batch.runtime.JobExecution; -import javax.batch.runtime.StepExecution; +import jakarta.batch.operations.JobOperator; +import jakarta.batch.runtime.BatchRuntime; +import jakarta.batch.runtime.BatchStatus; +import jakarta.batch.runtime.JobExecution; +import jakarta.batch.runtime.StepExecution; import java.util.ArrayList; import java.util.Date; import java.util.LinkedHashMap; diff --git a/src/main/java/edu/harvard/iq/dataverse/batch/entities/StepExecutionEntity.java b/src/main/java/edu/harvard/iq/dataverse/batch/entities/StepExecutionEntity.java index 65ed3f32e1b..ba20386ed07 100644 --- a/src/main/java/edu/harvard/iq/dataverse/batch/entities/StepExecutionEntity.java +++ b/src/main/java/edu/harvard/iq/dataverse/batch/entities/StepExecutionEntity.java @@ -1,8 +1,8 @@ package edu.harvard.iq.dataverse.batch.entities; -import javax.batch.runtime.BatchStatus; -import javax.batch.runtime.Metric; -import javax.batch.runtime.StepExecution; +import jakarta.batch.runtime.BatchStatus; +import jakarta.batch.runtime.Metric; +import jakarta.batch.runtime.StepExecution; import java.util.Date; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/edu/harvard/iq/dataverse/batch/jobs/importer/filesystem/FileRecordJobListener.java b/src/main/java/edu/harvard/iq/dataverse/batch/jobs/importer/filesystem/FileRecordJobListener.java index a5ba9a00bd2..593a5cbfdc3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/batch/jobs/importer/filesystem/FileRecordJobListener.java +++ b/src/main/java/edu/harvard/iq/dataverse/batch/jobs/importer/filesystem/FileRecordJobListener.java @@ -40,22 +40,22 @@ import edu.harvard.iq.dataverse.engine.command.DataverseRequest; import edu.harvard.iq.dataverse.engine.command.impl.UpdateDatasetVersionCommand; -import javax.batch.api.BatchProperty; -import javax.batch.api.chunk.listener.ItemReadListener; -import javax.batch.api.listener.JobListener; -import javax.batch.api.listener.StepListener; -import javax.batch.operations.JobOperator; -import javax.batch.runtime.BatchRuntime; -import javax.batch.runtime.BatchStatus; -import javax.batch.runtime.JobExecution; -import javax.batch.runtime.StepExecution; -import javax.batch.runtime.context.JobContext; -import javax.batch.runtime.context.StepContext; -import javax.ejb.EJB; -import javax.enterprise.context.Dependent; -import javax.inject.Inject; -import javax.inject.Named; -import javax.servlet.http.HttpServletRequest; +import jakarta.batch.api.BatchProperty; +import jakarta.batch.api.chunk.listener.ItemReadListener; +import jakarta.batch.api.listener.JobListener; +import jakarta.batch.api.listener.StepListener; +import jakarta.batch.operations.JobOperator; +import jakarta.batch.runtime.BatchRuntime; +import jakarta.batch.runtime.BatchStatus; +import jakarta.batch.runtime.JobExecution; +import jakarta.batch.runtime.StepExecution; +import jakarta.batch.runtime.context.JobContext; +import jakarta.batch.runtime.context.StepContext; +import jakarta.ejb.EJB; +import jakarta.enterprise.context.Dependent; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.servlet.http.HttpServletRequest; import edu.harvard.iq.dataverse.settings.JvmSettings; import org.apache.commons.io.IOUtils; @@ -74,8 +74,8 @@ import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.Logger; -import javax.batch.operations.JobSecurityException; -import javax.batch.operations.NoSuchJobExecutionException; +import jakarta.batch.operations.JobSecurityException; +import jakarta.batch.operations.NoSuchJobExecutionException; @Named @Dependent diff --git a/src/main/java/edu/harvard/iq/dataverse/batch/jobs/importer/filesystem/FileRecordProcessor.java b/src/main/java/edu/harvard/iq/dataverse/batch/jobs/importer/filesystem/FileRecordProcessor.java index af7caf32a7c..e5db80b9aa6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/batch/jobs/importer/filesystem/FileRecordProcessor.java +++ b/src/main/java/edu/harvard/iq/dataverse/batch/jobs/importer/filesystem/FileRecordProcessor.java @@ -25,15 +25,15 @@ import edu.harvard.iq.dataverse.DatasetServiceBean; import edu.harvard.iq.dataverse.DatasetVersion; -import javax.annotation.PostConstruct; -import javax.batch.api.chunk.ItemProcessor; -import javax.batch.operations.JobOperator; -import javax.batch.runtime.BatchRuntime; -import javax.batch.runtime.context.JobContext; -import javax.ejb.EJB; -import javax.enterprise.context.Dependent; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.annotation.PostConstruct; +import jakarta.batch.api.chunk.ItemProcessor; +import jakarta.batch.operations.JobOperator; +import jakarta.batch.runtime.BatchRuntime; +import jakarta.batch.runtime.context.JobContext; +import jakarta.ejb.EJB; +import jakarta.enterprise.context.Dependent; +import jakarta.inject.Inject; +import jakarta.inject.Named; import java.io.File; import java.util.Properties; import java.util.logging.Level; diff --git a/src/main/java/edu/harvard/iq/dataverse/batch/jobs/importer/filesystem/FileRecordReader.java b/src/main/java/edu/harvard/iq/dataverse/batch/jobs/importer/filesystem/FileRecordReader.java index a4f8ffd2378..fb702c21df2 100644 --- a/src/main/java/edu/harvard/iq/dataverse/batch/jobs/importer/filesystem/FileRecordReader.java +++ b/src/main/java/edu/harvard/iq/dataverse/batch/jobs/importer/filesystem/FileRecordReader.java @@ -28,17 +28,17 @@ import org.apache.commons.io.filefilter.NotFileFilter; import org.apache.commons.io.filefilter.WildcardFileFilter; -import javax.annotation.PostConstruct; -import javax.batch.api.BatchProperty; -import javax.batch.api.chunk.AbstractItemReader; -import javax.batch.operations.JobOperator; -import javax.batch.runtime.BatchRuntime; -import javax.batch.runtime.context.JobContext; -import javax.batch.runtime.context.StepContext; -import javax.ejb.EJB; -import javax.enterprise.context.Dependent; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.annotation.PostConstruct; +import jakarta.batch.api.BatchProperty; +import jakarta.batch.api.chunk.AbstractItemReader; +import jakarta.batch.operations.JobOperator; +import jakarta.batch.runtime.BatchRuntime; +import jakarta.batch.runtime.context.JobContext; +import jakarta.batch.runtime.context.StepContext; +import jakarta.ejb.EJB; +import jakarta.enterprise.context.Dependent; +import jakarta.inject.Inject; +import jakarta.inject.Named; import java.io.File; import java.io.FileFilter; import java.io.Serializable; diff --git a/src/main/java/edu/harvard/iq/dataverse/batch/jobs/importer/filesystem/FileRecordWriter.java b/src/main/java/edu/harvard/iq/dataverse/batch/jobs/importer/filesystem/FileRecordWriter.java index 291396b4d33..0a73bea0e90 100644 --- a/src/main/java/edu/harvard/iq/dataverse/batch/jobs/importer/filesystem/FileRecordWriter.java +++ b/src/main/java/edu/harvard/iq/dataverse/batch/jobs/importer/filesystem/FileRecordWriter.java @@ -36,17 +36,17 @@ import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import edu.harvard.iq.dataverse.util.FileUtil; -import javax.annotation.PostConstruct; -import javax.batch.api.BatchProperty; -import javax.batch.api.chunk.AbstractItemWriter; -import javax.batch.operations.JobOperator; -import javax.batch.runtime.BatchRuntime; -import javax.batch.runtime.context.JobContext; -import javax.batch.runtime.context.StepContext; -import javax.ejb.EJB; -import javax.enterprise.context.Dependent; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.annotation.PostConstruct; +import jakarta.batch.api.BatchProperty; +import jakarta.batch.api.chunk.AbstractItemWriter; +import jakarta.batch.operations.JobOperator; +import jakarta.batch.runtime.BatchRuntime; +import jakarta.batch.runtime.context.JobContext; +import jakarta.batch.runtime.context.StepContext; +import jakarta.ejb.EJB; +import jakarta.enterprise.context.Dependent; +import jakarta.inject.Inject; +import jakarta.inject.Named; import java.io.File; import java.io.Serializable; import java.sql.Timestamp; @@ -57,7 +57,7 @@ import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import edu.harvard.iq.dataverse.GlobalIdServiceBean; @Named diff --git a/src/main/java/edu/harvard/iq/dataverse/batch/util/LoggingUtil.java b/src/main/java/edu/harvard/iq/dataverse/batch/util/LoggingUtil.java index a2f76ca953d..19d1112ba54 100644 --- a/src/main/java/edu/harvard/iq/dataverse/batch/util/LoggingUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/batch/util/LoggingUtil.java @@ -25,7 +25,7 @@ import edu.harvard.iq.dataverse.engine.command.Command; import org.apache.commons.io.FileUtils; -import javax.batch.runtime.JobExecution; +import jakarta.batch.runtime.JobExecution; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; diff --git a/src/main/java/edu/harvard/iq/dataverse/branding/BrandingUtil.java b/src/main/java/edu/harvard/iq/dataverse/branding/BrandingUtil.java index 3cb071fe03f..c230229abf9 100644 --- a/src/main/java/edu/harvard/iq/dataverse/branding/BrandingUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/branding/BrandingUtil.java @@ -6,7 +6,7 @@ import java.util.Arrays; import java.util.logging.Logger; -import javax.mail.internet.InternetAddress; +import jakarta.mail.internet.InternetAddress; public class BrandingUtil { diff --git a/src/main/java/edu/harvard/iq/dataverse/branding/BrandingUtilHelper.java b/src/main/java/edu/harvard/iq/dataverse/branding/BrandingUtilHelper.java index 274970f8b8e..7729ab4763e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/branding/BrandingUtilHelper.java +++ b/src/main/java/edu/harvard/iq/dataverse/branding/BrandingUtilHelper.java @@ -1,9 +1,9 @@ package edu.harvard.iq.dataverse.branding; -import javax.annotation.PostConstruct; -import javax.ejb.EJB; -import javax.ejb.Singleton; -import javax.ejb.Startup; +import jakarta.annotation.PostConstruct; +import jakarta.ejb.EJB; +import jakarta.ejb.Singleton; +import jakarta.ejb.Startup; import edu.harvard.iq.dataverse.DataverseServiceBean; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; diff --git a/src/main/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailData.java b/src/main/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailData.java index c05750c13e6..0ad9ab59f4b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailData.java +++ b/src/main/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailData.java @@ -5,17 +5,17 @@ import java.sql.Timestamp; import java.util.Date; import java.util.UUID; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.OneToOne; -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.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailPage.java b/src/main/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailPage.java index 07aea0d5011..b76e3db1379 100644 --- a/src/main/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailPage.java @@ -7,10 +7,10 @@ import edu.harvard.iq.dataverse.util.JsfHelper; import java.util.Arrays; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.ejb.EJB; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailServiceBean.java index e1053c3a93f..a54fd6bb0c1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailServiceBean.java @@ -1,6 +1,5 @@ package edu.harvard.iq.dataverse.confirmemail; -import edu.harvard.iq.dataverse.Dataverse; import edu.harvard.iq.dataverse.DataverseServiceBean; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean; @@ -16,13 +15,13 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.NonUniqueResultException; -import javax.persistence.PersistenceContext; -import javax.persistence.TypedQuery; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.persistence.EntityManager; +import jakarta.persistence.NoResultException; +import jakarta.persistence.NonUniqueResultException; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.TypedQuery; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/dashboard/DashboardDatamovePage.java b/src/main/java/edu/harvard/iq/dataverse/dashboard/DashboardDatamovePage.java index 54e3114a0ae..6fc80312bf5 100644 --- a/src/main/java/edu/harvard/iq/dataverse/dashboard/DashboardDatamovePage.java +++ b/src/main/java/edu/harvard/iq/dataverse/dashboard/DashboardDatamovePage.java @@ -8,7 +8,6 @@ import edu.harvard.iq.dataverse.EjbDataverseEngine; import edu.harvard.iq.dataverse.PermissionsWrapper; import edu.harvard.iq.dataverse.SettingsWrapper; -import edu.harvard.iq.dataverse.authorization.groups.impl.ipaddress.ip.IpAddress; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.engine.command.DataverseRequest; import edu.harvard.iq.dataverse.engine.command.exception.CommandException; @@ -22,16 +21,16 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.faces.application.FacesMessage; -import javax.faces.component.UIInput; -import javax.faces.context.FacesContext; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.servlet.http.HttpServletRequest; +import jakarta.ejb.EJB; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.component.UIInput; +import jakarta.faces.context.FacesContext; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.servlet.http.HttpServletRequest; @ViewScoped @Named("DashboardDatamovePage") diff --git a/src/main/java/edu/harvard/iq/dataverse/dashboard/DashboardUsersPage.java b/src/main/java/edu/harvard/iq/dataverse/dashboard/DashboardUsersPage.java index 5b5a21e21bf..477e4c0fdd6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/dashboard/DashboardUsersPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/dashboard/DashboardUsersPage.java @@ -24,10 +24,10 @@ import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.ejb.EJB; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; @ViewScoped @Named("DashboardUsersPage") diff --git a/src/main/java/edu/harvard/iq/dataverse/dataaccess/S3AccessIO.java b/src/main/java/edu/harvard/iq/dataverse/dataaccess/S3AccessIO.java index f6bca84941e..822ada0b83e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/dataaccess/S3AccessIO.java +++ b/src/main/java/edu/harvard/iq/dataverse/dataaccess/S3AccessIO.java @@ -69,9 +69,9 @@ import org.eclipse.microprofile.config.Config; import org.eclipse.microprofile.config.ConfigProvider; -import javax.json.Json; -import javax.json.JsonObjectBuilder; -import javax.validation.constraints.NotNull; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; +import jakarta.validation.constraints.NotNull; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleServiceBean.java index c33b4e0fc71..bf5d4a0d6ab 100644 --- a/src/main/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleServiceBean.java @@ -6,8 +6,8 @@ import com.mashape.unirest.http.Unirest; import com.mashape.unirest.http.exceptions.UnirestException; import java.io.Serializable; -import javax.ejb.Stateless; -import javax.inject.Named; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; /** * This class contains all the methods that have external runtime dependencies diff --git a/src/main/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleUtil.java b/src/main/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleUtil.java index 1aa384d205e..460e4727afc 100644 --- a/src/main/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleUtil.java @@ -8,9 +8,9 @@ import edu.harvard.iq.dataverse.util.SystemConfig; import java.util.Arrays; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; public class DataCaptureModuleUtil { diff --git a/src/main/java/edu/harvard/iq/dataverse/datasetutility/AddReplaceFileHelper.java b/src/main/java/edu/harvard/iq/dataverse/datasetutility/AddReplaceFileHelper.java index 4c2510b6ccb..e587160bdef 100644 --- a/src/main/java/edu/harvard/iq/dataverse/datasetutility/AddReplaceFileHelper.java +++ b/src/main/java/edu/harvard/iq/dataverse/datasetutility/AddReplaceFileHelper.java @@ -17,7 +17,6 @@ import edu.harvard.iq.dataverse.PermissionServiceBean; import edu.harvard.iq.dataverse.api.ApiConstants; import edu.harvard.iq.dataverse.api.Util; -import edu.harvard.iq.dataverse.api.Files; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.authorization.users.User; import edu.harvard.iq.dataverse.dataaccess.DataAccess; @@ -48,23 +47,23 @@ import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.Asynchronous; -import javax.ejb.EJBException; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonNumber; -import javax.json.JsonObject; -import javax.json.JsonArray; -import javax.json.JsonObjectBuilder; -import javax.validation.ConstraintViolation; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.ejb.Asynchronous; +import jakarta.ejb.EJBException; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonNumber; +import jakarta.json.JsonObject; +import jakarta.json.JsonArray; +import jakarta.json.JsonObjectBuilder; +import jakarta.validation.ConstraintViolation; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder; import org.apache.commons.io.IOUtils; import org.ocpsoft.common.util.Strings; -import static javax.ws.rs.core.Response.Status.BAD_REQUEST; +import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; /** * Methods to add or replace a single file. @@ -2152,7 +2151,7 @@ public Response addFiles(String jsonData, Dataset dataset, User authUser) { } } - catch ( javax.json.stream.JsonParsingException ex) { + catch ( jakarta.json.stream.JsonParsingException ex) { ex.printStackTrace(); return error(BAD_REQUEST, "Json Parsing Exception :" + ex.getMessage()); } @@ -2321,7 +2320,7 @@ public Response replaceFiles(String jsonData, Dataset ds, User authUser) { } } - catch ( javax.json.stream.JsonParsingException ex) { + catch ( jakarta.json.stream.JsonParsingException ex) { ex.printStackTrace(); return error(BAD_REQUEST, "Json Parsing Exception :" + ex.getMessage()); } diff --git a/src/main/java/edu/harvard/iq/dataverse/datavariable/CategoryMetadata.java b/src/main/java/edu/harvard/iq/dataverse/datavariable/CategoryMetadata.java index 5e03899b790..a9b1694d842 100644 --- a/src/main/java/edu/harvard/iq/dataverse/datavariable/CategoryMetadata.java +++ b/src/main/java/edu/harvard/iq/dataverse/datavariable/CategoryMetadata.java @@ -1,13 +1,13 @@ package edu.harvard.iq.dataverse.datavariable; -import javax.persistence.Index; -import javax.persistence.Entity; -import javax.persistence.Table; -import javax.persistence.GenerationType; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.ManyToOne; -import javax.persistence.JoinColumn; +import jakarta.persistence.Index; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import jakarta.persistence.GenerationType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.JoinColumn; @Entity @Table(indexes = {@Index(columnList="category_id"), @Index(columnList="variablemetadata_id")}) diff --git a/src/main/java/edu/harvard/iq/dataverse/datavariable/DataVariable.java b/src/main/java/edu/harvard/iq/dataverse/datavariable/DataVariable.java index 6462f690cac..b2e9441a163 100644 --- a/src/main/java/edu/harvard/iq/dataverse/datavariable/DataVariable.java +++ b/src/main/java/edu/harvard/iq/dataverse/datavariable/DataVariable.java @@ -8,22 +8,22 @@ import java.io.Serializable; import java.util.Collection; -import javax.persistence.CascadeType; -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.OneToMany; +import jakarta.persistence.CascadeType; +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.OneToMany; import org.hibernate.validator.constraints.NotBlank; import edu.harvard.iq.dataverse.DataTable; import java.util.ArrayList; import java.util.List; -import javax.persistence.Column; -import javax.persistence.Index; -import javax.persistence.OrderBy; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Index; +import jakarta.persistence.OrderBy; +import jakarta.persistence.Table; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/datavariable/SummaryStatistic.java b/src/main/java/edu/harvard/iq/dataverse/datavariable/SummaryStatistic.java index bf81aff3e2b..6896ef360ce 100644 --- a/src/main/java/edu/harvard/iq/dataverse/datavariable/SummaryStatistic.java +++ b/src/main/java/edu/harvard/iq/dataverse/datavariable/SummaryStatistic.java @@ -7,14 +7,14 @@ package edu.harvard.iq.dataverse.datavariable; import java.io.Serializable; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; /* * diff --git a/src/main/java/edu/harvard/iq/dataverse/datavariable/VarGroup.java b/src/main/java/edu/harvard/iq/dataverse/datavariable/VarGroup.java index 242110e333f..b52c76930d7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/datavariable/VarGroup.java +++ b/src/main/java/edu/harvard/iq/dataverse/datavariable/VarGroup.java @@ -1,14 +1,14 @@ package edu.harvard.iq.dataverse.datavariable; -import javax.persistence.Entity; -import javax.persistence.Table; -import javax.persistence.Index; -import javax.persistence.Id; -import javax.persistence.ManyToOne; -import javax.persistence.JoinColumn; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import jakarta.persistence.Index; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Column; import java.util.HashSet; import java.util.Set; diff --git a/src/main/java/edu/harvard/iq/dataverse/datavariable/VariableCategory.java b/src/main/java/edu/harvard/iq/dataverse/datavariable/VariableCategory.java index 6a3e702a561..5ccef82b5d1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/datavariable/VariableCategory.java +++ b/src/main/java/edu/harvard/iq/dataverse/datavariable/VariableCategory.java @@ -8,16 +8,16 @@ import java.io.Serializable; import java.util.List; -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 jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import edu.harvard.iq.dataverse.util.AlphaNumericComparator; -import javax.persistence.Index; -import javax.persistence.Table; +import jakarta.persistence.Index; +import jakarta.persistence.Table; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/datavariable/VariableMetadata.java b/src/main/java/edu/harvard/iq/dataverse/datavariable/VariableMetadata.java index c18355c9979..29e821c28a4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/datavariable/VariableMetadata.java +++ b/src/main/java/edu/harvard/iq/dataverse/datavariable/VariableMetadata.java @@ -2,18 +2,18 @@ import java.io.Serializable; -import javax.persistence.Entity; -import javax.persistence.Table; -import javax.persistence.Index; -import javax.persistence.UniqueConstraint; -import javax.persistence.Id; -import javax.persistence.ManyToOne; -import javax.persistence.JoinColumn; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Column; -import javax.persistence.OneToMany; -import javax.persistence.CascadeType; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import jakarta.persistence.Index; +import jakarta.persistence.UniqueConstraint; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Column; +import jakarta.persistence.OneToMany; +import jakarta.persistence.CascadeType; import java.util.Collection; import java.util.ArrayList; diff --git a/src/main/java/edu/harvard/iq/dataverse/datavariable/VariableRange.java b/src/main/java/edu/harvard/iq/dataverse/datavariable/VariableRange.java index 17098e6af54..eb04eac846b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/datavariable/VariableRange.java +++ b/src/main/java/edu/harvard/iq/dataverse/datavariable/VariableRange.java @@ -7,14 +7,14 @@ package edu.harvard.iq.dataverse.datavariable; import java.io.Serializable; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/datavariable/VariableRangeItem.java b/src/main/java/edu/harvard/iq/dataverse/datavariable/VariableRangeItem.java index 81db4225515..d5f99f7e016 100644 --- a/src/main/java/edu/harvard/iq/dataverse/datavariable/VariableRangeItem.java +++ b/src/main/java/edu/harvard/iq/dataverse/datavariable/VariableRangeItem.java @@ -8,14 +8,14 @@ import java.io.Serializable; import java.math.BigDecimal; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/datavariable/VariableServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/datavariable/VariableServiceBean.java index 8287d1c7041..4636b126e0a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/datavariable/VariableServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/datavariable/VariableServiceBean.java @@ -7,12 +7,12 @@ package edu.harvard.iq.dataverse.datavariable; import java.util.List; -import java.util.logging.Logger; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.TypedQuery; + +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.TypedQuery; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/dataverse/DataverseUtil.java b/src/main/java/edu/harvard/iq/dataverse/dataverse/DataverseUtil.java index 04e7d56fad6..1ae16e5a341 100644 --- a/src/main/java/edu/harvard/iq/dataverse/dataverse/DataverseUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/dataverse/DataverseUtil.java @@ -15,7 +15,7 @@ import java.util.Map; import java.util.logging.Logger; -import javax.ws.rs.BadRequestException; +import jakarta.ws.rs.BadRequestException; import opennlp.tools.util.StringUtil; import org.apache.commons.io.FileUtils; diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/CommandContext.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/CommandContext.java index ef5b9dba407..55a375acb6c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/CommandContext.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/CommandContext.java @@ -42,7 +42,7 @@ import edu.harvard.iq.dataverse.util.SystemConfig; import edu.harvard.iq.dataverse.workflow.WorkflowServiceBean; import java.util.Stack; -import javax.persistence.EntityManager; +import jakarta.persistence.EntityManager; /** * An interface for accessing Dataverse's resources, user info etc. Used by the diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/DataverseRequest.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/DataverseRequest.java index f0cba005a4a..27f26d16ce3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/DataverseRequest.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/DataverseRequest.java @@ -1,7 +1,6 @@ package edu.harvard.iq.dataverse.engine.command; import edu.harvard.iq.dataverse.api.AbstractApiBean; -import edu.harvard.iq.dataverse.api.batchjob.FileRecordJobResource; import edu.harvard.iq.dataverse.authorization.groups.impl.ipaddress.ip.IpAddress; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.authorization.users.User; @@ -10,7 +9,7 @@ import java.util.HashSet; import java.util.logging.Logger; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractDatasetCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractDatasetCommand.java index 4e3c2835382..a355d1851f7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractDatasetCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractDatasetCommand.java @@ -19,7 +19,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import static java.util.stream.Collectors.joining; -import javax.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolation; import edu.harvard.iq.dataverse.GlobalIdServiceBean; import edu.harvard.iq.dataverse.TermsOfUseAndAccess; import edu.harvard.iq.dataverse.pidproviders.FakePidProviderServiceBean; diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/AddRoleAssigneesToExplicitGroupCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/AddRoleAssigneesToExplicitGroupCommand.java index 8ba1d181609..59c5d970b09 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/AddRoleAssigneesToExplicitGroupCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/AddRoleAssigneesToExplicitGroupCommand.java @@ -16,7 +16,7 @@ import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJBException; +import jakarta.ejb.EJBException; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/ChangeUserIdentifierCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/ChangeUserIdentifierCommand.java index 4a5998aea00..94aff3e3f5d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/ChangeUserIdentifierCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/ChangeUserIdentifierCommand.java @@ -18,11 +18,11 @@ import edu.harvard.iq.dataverse.engine.command.exception.IllegalCommandException; import java.util.List; import java.util.Set; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; -import javax.validation.ValidatorFactory; -import javax.ws.rs.core.Response; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; +import jakarta.ws.rs.core.Response; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateRoleCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateRoleCommand.java index cb9b0a3c774..8cffcd3d821 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateRoleCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateRoleCommand.java @@ -1,7 +1,6 @@ package edu.harvard.iq.dataverse.engine.command.impl; import edu.harvard.iq.dataverse.Dataverse; -import edu.harvard.iq.dataverse.api.AbstractApiBean; import edu.harvard.iq.dataverse.authorization.DataverseRole; import edu.harvard.iq.dataverse.authorization.Permission; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; @@ -13,7 +12,7 @@ import edu.harvard.iq.dataverse.engine.command.exception.CommandException; import edu.harvard.iq.dataverse.engine.command.exception.IllegalCommandException; import edu.harvard.iq.dataverse.util.BundleUtil; -import javax.persistence.NoResultException; +import jakarta.persistence.NoResultException; /** * Create a new role in a dataverse. diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateSavedSearchCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateSavedSearchCommand.java index 147e1870566..7a549a51dd5 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateSavedSearchCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateSavedSearchCommand.java @@ -12,7 +12,7 @@ import edu.harvard.iq.dataverse.search.savedsearch.SavedSearchServiceBean; import java.util.logging.Level; import java.util.logging.Logger; -import javax.json.JsonObjectBuilder; +import jakarta.json.JsonObjectBuilder; @RequiredPermissions(Permission.PublishDataverse) public class CreateSavedSearchCommand extends AbstractCommand { diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/DRSSubmitToArchiveCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/DRSSubmitToArchiveCommand.java index f23033f09fa..594d4fe25ba 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/DRSSubmitToArchiveCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/DRSSubmitToArchiveCommand.java @@ -34,10 +34,10 @@ import java.util.Set; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.JsonValue; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonValue; import javax.net.ssl.SSLContext; import org.apache.commons.codec.digest.DigestUtils; diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/DuraCloudSubmitToArchiveCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/DuraCloudSubmitToArchiveCommand.java index 2ca73af3b3c..d6d7b49d172 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/DuraCloudSubmitToArchiveCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/DuraCloudSubmitToArchiveCommand.java @@ -21,8 +21,8 @@ import java.util.Map; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonObjectBuilder; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; import org.apache.commons.codec.binary.Hex; import org.duracloud.client.ContentStore; diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/FinalizeDatasetPublicationCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/FinalizeDatasetPublicationCommand.java index 253c761f0c3..f5e70209744 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/FinalizeDatasetPublicationCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/FinalizeDatasetPublicationCommand.java @@ -37,8 +37,8 @@ import java.util.concurrent.Future; import org.apache.solr.client.solrj.SolrServerException; -import javax.ejb.EJB; -import javax.inject.Inject; +import jakarta.ejb.EJB; +import jakarta.inject.Inject; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GetProvJsonCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GetProvJsonCommand.java index 23f08aadd3e..2de2adff099 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GetProvJsonCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GetProvJsonCommand.java @@ -12,9 +12,9 @@ import java.io.IOException; import java.io.InputStream; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonReader; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; @RequiredPermissions(Permission.EditDataset) public class GetProvJsonCommand extends AbstractCommand { diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GetUserTracesCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GetUserTracesCommand.java index f3324ba6f2e..e41d70d9804 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GetUserTracesCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GetUserTracesCommand.java @@ -17,14 +17,14 @@ import edu.harvard.iq.dataverse.engine.command.exception.PermissionException; import edu.harvard.iq.dataverse.search.savedsearch.SavedSearch; import edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder; -import java.math.BigDecimal; + import java.util.List; import java.util.Set; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObjectBuilder; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObjectBuilder; // Superuser-only enforced below. @RequiredPermissions({}) diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GoogleCloudSubmitToArchiveCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GoogleCloudSubmitToArchiveCommand.java index da2701a41e7..512987866d4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GoogleCloudSubmitToArchiveCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GoogleCloudSubmitToArchiveCommand.java @@ -19,8 +19,8 @@ import edu.harvard.iq.dataverse.workflow.step.WorkflowStepResult; import org.apache.commons.codec.binary.Hex; -import javax.json.Json; -import javax.json.JsonObjectBuilder; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; import java.io.File; import java.io.FileInputStream; import java.io.IOException; diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/ImportFromFileSystemCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/ImportFromFileSystemCommand.java index 5f31ea756eb..c03c77d42fd 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/ImportFromFileSystemCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/ImportFromFileSystemCommand.java @@ -14,12 +14,12 @@ import edu.harvard.iq.dataverse.engine.command.exception.IllegalCommandException; import edu.harvard.iq.dataverse.settings.JvmSettings; -import javax.batch.operations.JobOperator; -import javax.batch.operations.JobSecurityException; -import javax.batch.operations.JobStartException; -import javax.batch.runtime.BatchRuntime; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; +import jakarta.batch.operations.JobOperator; +import jakarta.batch.operations.JobSecurityException; +import jakarta.batch.operations.JobStartException; +import jakarta.batch.runtime.BatchRuntime; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; import java.io.File; import java.util.Properties; import java.util.logging.Level; diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/LinkDataverseCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/LinkDataverseCommand.java index 1c63a1a3c4f..55fe96556a5 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/LinkDataverseCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/LinkDataverseCommand.java @@ -23,8 +23,8 @@ import java.util.Arrays; import java.util.Collections; import java.util.Date; -import java.util.concurrent.Future; -import javax.ws.rs.core.Response; + +import jakarta.ws.rs.core.Response; import org.apache.solr.client.solrj.SolrServerException; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/LocalSubmitToArchiveCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/LocalSubmitToArchiveCommand.java index c7e91b2967b..d2f061b6e70 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/LocalSubmitToArchiveCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/LocalSubmitToArchiveCommand.java @@ -17,8 +17,8 @@ import java.util.Map; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonObjectBuilder; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; import java.io.File; import java.io.FileOutputStream; diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/RedetectFileTypeCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/RedetectFileTypeCommand.java index bdb6ceffd6d..b9346a43af8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/RedetectFileTypeCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/RedetectFileTypeCommand.java @@ -20,7 +20,7 @@ import java.nio.channels.FileChannel; import java.nio.channels.ReadableByteChannel; import java.util.logging.Logger; -import javax.ejb.EJBException; +import jakarta.ejb.EJBException; @RequiredPermissions(Permission.EditDataset) public class RedetectFileTypeCommand extends AbstractCommand { diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/S3SubmitToArchiveCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/S3SubmitToArchiveCommand.java index f24d956e9d7..f02edd54b86 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/S3SubmitToArchiveCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/S3SubmitToArchiveCommand.java @@ -20,9 +20,9 @@ import java.util.Map; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; import org.eclipse.microprofile.config.Config; import org.eclipse.microprofile.config.ConfigProvider; diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UningestFileCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UningestFileCommand.java index 29180f65e36..f2b89746160 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UningestFileCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UningestFileCommand.java @@ -22,11 +22,11 @@ import edu.harvard.iq.dataverse.engine.command.exception.IllegalCommandException; import edu.harvard.iq.dataverse.engine.command.exception.PermissionException; import edu.harvard.iq.dataverse.util.FileUtil; -import edu.harvard.iq.dataverse.util.StringUtil; + import java.io.IOException; import java.util.Collections; import java.util.logging.Logger; -import javax.persistence.Query; +import jakarta.persistence.Query; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetVersionCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetVersionCommand.java index 12a5d8611f4..2ed4772b571 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetVersionCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetVersionCommand.java @@ -16,7 +16,7 @@ import java.util.logging.Level; import java.util.logging.Logger; -import javax.validation.ConstraintViolationException; +import jakarta.validation.ConstraintViolationException; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDataverseCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDataverseCommand.java index 218b0ea89d9..56c76f04c05 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDataverseCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDataverseCommand.java @@ -6,7 +6,7 @@ import edu.harvard.iq.dataverse.Dataverse.DataverseType; import edu.harvard.iq.dataverse.DataverseFieldTypeInputLevel; import edu.harvard.iq.dataverse.authorization.Permission; -import edu.harvard.iq.dataverse.batch.util.LoggingUtil; + import static edu.harvard.iq.dataverse.dataverse.DataverseUtil.validateDataverseMetadataExternally; import edu.harvard.iq.dataverse.engine.command.AbstractCommand; import edu.harvard.iq.dataverse.engine.command.CommandContext; @@ -14,14 +14,11 @@ import edu.harvard.iq.dataverse.engine.command.RequiredPermissions; import edu.harvard.iq.dataverse.engine.command.exception.CommandException; import edu.harvard.iq.dataverse.engine.command.exception.IllegalCommandException; -import edu.harvard.iq.dataverse.search.IndexResponse; -import java.io.IOException; + import java.util.ArrayList; import java.util.List; -import java.util.concurrent.Future; import java.util.logging.Logger; -import javax.persistence.TypedQuery; -import org.apache.solr.client.solrj.SolrServerException; +import jakarta.persistence.TypedQuery; /** * Update an existing dataverse. diff --git a/src/main/java/edu/harvard/iq/dataverse/export/DCTermsExporter.java b/src/main/java/edu/harvard/iq/dataverse/export/DCTermsExporter.java index 8df17e71ae6..f82c0d9ad3d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/DCTermsExporter.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/DCTermsExporter.java @@ -12,7 +12,7 @@ import java.util.Locale; import java.util.Optional; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import javax.xml.stream.XMLStreamException; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/export/DDIExportServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/export/DDIExportServiceBean.java index 59ff539af37..5119b4b96c7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/DDIExportServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/DDIExportServiceBean.java @@ -33,14 +33,14 @@ import java.util.logging.Logger; import java.util.logging.Level; import java.io.OutputStream; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.ejb.TransactionAttribute; -import javax.ejb.TransactionAttributeType; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.ejb.TransactionAttribute; +import jakarta.ejb.TransactionAttributeType; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import javax.xml.stream.XMLStreamWriter; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLOutputFactory; diff --git a/src/main/java/edu/harvard/iq/dataverse/export/DDIExporter.java b/src/main/java/edu/harvard/iq/dataverse/export/DDIExporter.java index 66a9ea6c665..d48ce3a537d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/DDIExporter.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/DDIExporter.java @@ -2,7 +2,6 @@ package edu.harvard.iq.dataverse.export; import com.google.auto.service.AutoService; -import edu.harvard.iq.dataverse.DatasetVersion; import edu.harvard.iq.dataverse.export.ddi.DdiExportUtil; import io.gdcc.spi.export.ExportDataProvider; import io.gdcc.spi.export.ExportException; @@ -13,7 +12,7 @@ import java.util.Locale; import java.util.Optional; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; import javax.xml.stream.XMLOutputFactory; diff --git a/src/main/java/edu/harvard/iq/dataverse/export/DublinCoreExporter.java b/src/main/java/edu/harvard/iq/dataverse/export/DublinCoreExporter.java index 04b7892d737..0fa32dd4bfa 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/DublinCoreExporter.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/DublinCoreExporter.java @@ -2,7 +2,6 @@ package edu.harvard.iq.dataverse.export; import com.google.auto.service.AutoService; -import edu.harvard.iq.dataverse.DatasetVersion; import edu.harvard.iq.dataverse.export.dublincore.DublinCoreExportUtil; import io.gdcc.spi.export.ExportDataProvider; import io.gdcc.spi.export.ExportException; @@ -13,7 +12,7 @@ import java.util.Locale; import java.util.Optional; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import javax.xml.stream.XMLStreamException; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/export/ExportService.java b/src/main/java/edu/harvard/iq/dataverse/export/ExportService.java index eed84a19a66..8342e7df92a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/ExportService.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/ExportService.java @@ -9,7 +9,6 @@ import static edu.harvard.iq.dataverse.dataaccess.DataAccess.getStorageIO; import edu.harvard.iq.dataverse.dataaccess.DataAccessOption; import edu.harvard.iq.dataverse.dataaccess.StorageIO; -import io.gdcc.spi.export.ExportDataProvider; import io.gdcc.spi.export.ExportException; import io.gdcc.spi.export.Exporter; import io.gdcc.spi.export.XMLExporter; @@ -47,7 +46,7 @@ import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MediaType; import org.apache.commons.io.IOUtils; diff --git a/src/main/java/edu/harvard/iq/dataverse/export/HtmlCodeBookExporter.java b/src/main/java/edu/harvard/iq/dataverse/export/HtmlCodeBookExporter.java index 1b449060b17..9d0b107299e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/HtmlCodeBookExporter.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/HtmlCodeBookExporter.java @@ -1,23 +1,18 @@ package edu.harvard.iq.dataverse.export; import com.google.auto.service.AutoService; -import edu.harvard.iq.dataverse.Dataset; -import edu.harvard.iq.dataverse.DatasetVersion; import edu.harvard.iq.dataverse.export.ddi.DdiExportUtil; import io.gdcc.spi.export.ExportDataProvider; import io.gdcc.spi.export.ExportException; import io.gdcc.spi.export.Exporter; import edu.harvard.iq.dataverse.util.BundleUtil; -import javax.json.JsonObject; -import javax.ws.rs.core.MediaType; +import jakarta.json.JsonObject; +import jakarta.ws.rs.core.MediaType; import javax.xml.stream.XMLStreamException; -import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.nio.file.Path; -import java.nio.file.Paths; import java.util.Locale; import java.util.Optional; diff --git a/src/main/java/edu/harvard/iq/dataverse/export/InternalExportDataProvider.java b/src/main/java/edu/harvard/iq/dataverse/export/InternalExportDataProvider.java index efa2c0c9300..e8fdc92e91c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/InternalExportDataProvider.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/InternalExportDataProvider.java @@ -3,11 +3,11 @@ import java.io.InputStream; import java.util.Optional; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; import edu.harvard.iq.dataverse.DOIDataCiteRegisterService; import edu.harvard.iq.dataverse.DataCitation; diff --git a/src/main/java/edu/harvard/iq/dataverse/export/JSONExporter.java b/src/main/java/edu/harvard/iq/dataverse/export/JSONExporter.java index 30347017071..a54e61c7c1e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/JSONExporter.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/JSONExporter.java @@ -2,7 +2,6 @@ package edu.harvard.iq.dataverse.export; import com.google.auto.service.AutoService; -import edu.harvard.iq.dataverse.DatasetVersion; import io.gdcc.spi.export.ExportDataProvider; import io.gdcc.spi.export.ExportException; import io.gdcc.spi.export.Exporter; @@ -11,8 +10,8 @@ import java.util.Locale; import java.util.Optional; -import javax.json.JsonObject; -import javax.ws.rs.core.MediaType; +import jakarta.json.JsonObject; +import jakarta.ws.rs.core.MediaType; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/export/OAI_DDIExporter.java b/src/main/java/edu/harvard/iq/dataverse/export/OAI_DDIExporter.java index de97a88d1fa..0b4121c6025 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/OAI_DDIExporter.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/OAI_DDIExporter.java @@ -2,7 +2,6 @@ package edu.harvard.iq.dataverse.export; import com.google.auto.service.AutoService; -import edu.harvard.iq.dataverse.DatasetVersion; import edu.harvard.iq.dataverse.export.ddi.DdiExportUtil; import io.gdcc.spi.export.ExportDataProvider; import io.gdcc.spi.export.ExportException; @@ -13,7 +12,7 @@ import java.util.Locale; import java.util.Optional; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import javax.xml.stream.XMLStreamException; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/export/OAI_OREExporter.java b/src/main/java/edu/harvard/iq/dataverse/export/OAI_OREExporter.java index 06fee32e220..feec4403570 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/OAI_OREExporter.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/OAI_OREExporter.java @@ -1,21 +1,18 @@ package edu.harvard.iq.dataverse.export; import com.google.auto.service.AutoService; -import edu.harvard.iq.dataverse.DatasetVersion; import io.gdcc.spi.export.ExportDataProvider; import io.gdcc.spi.export.ExportException; import io.gdcc.spi.export.Exporter; -import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import edu.harvard.iq.dataverse.util.BundleUtil; -import edu.harvard.iq.dataverse.util.bagit.OREMap; + import java.io.OutputStream; import java.util.Locale; import java.util.Optional; -import java.util.ResourceBundle; import java.util.logging.Logger; -import javax.json.JsonObject; -import javax.ws.rs.core.MediaType; +import jakarta.json.JsonObject; +import jakarta.ws.rs.core.MediaType; @AutoService(Exporter.class) public class OAI_OREExporter implements Exporter { diff --git a/src/main/java/edu/harvard/iq/dataverse/export/OpenAireExporter.java b/src/main/java/edu/harvard/iq/dataverse/export/OpenAireExporter.java index 03b8ebfa76f..8bd4ae6a042 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/OpenAireExporter.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/OpenAireExporter.java @@ -3,12 +3,11 @@ import java.io.OutputStream; import java.util.Locale; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import javax.xml.stream.XMLStreamException; import com.google.auto.service.AutoService; -import edu.harvard.iq.dataverse.DatasetVersion; import edu.harvard.iq.dataverse.export.openaire.OpenAireExportUtil; import io.gdcc.spi.export.ExportDataProvider; import io.gdcc.spi.export.ExportException; diff --git a/src/main/java/edu/harvard/iq/dataverse/export/SchemaDotOrgExporter.java b/src/main/java/edu/harvard/iq/dataverse/export/SchemaDotOrgExporter.java index f3be1e83d2d..5428715b905 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/SchemaDotOrgExporter.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/SchemaDotOrgExporter.java @@ -9,7 +9,7 @@ import java.io.OutputStream; import java.util.Locale; import java.util.logging.Logger; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MediaType; /** * Schema.org JSON-LD is used by Google Dataset Search and other services to diff --git a/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java b/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java index c0b39dd6101..22cfc23337e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java @@ -3,26 +3,13 @@ import com.google.gson.Gson; import edu.harvard.iq.dataverse.ControlledVocabularyValue; -import edu.harvard.iq.dataverse.DataFile; -import edu.harvard.iq.dataverse.DataTable; import edu.harvard.iq.dataverse.DatasetFieldConstant; -import edu.harvard.iq.dataverse.DatasetVersion; import edu.harvard.iq.dataverse.DvObjectContainer; -import edu.harvard.iq.dataverse.FileMetadata; -import edu.harvard.iq.dataverse.GlobalId; import edu.harvard.iq.dataverse.api.dto.DatasetDTO; import edu.harvard.iq.dataverse.api.dto.DatasetVersionDTO; import edu.harvard.iq.dataverse.api.dto.FieldDTO; import edu.harvard.iq.dataverse.api.dto.FileDTO; import edu.harvard.iq.dataverse.api.dto.MetadataBlockDTO; -import edu.harvard.iq.dataverse.datavariable.VariableMetadata; -import edu.harvard.iq.dataverse.datavariable.DataVariable; -import edu.harvard.iq.dataverse.datavariable.VariableServiceBean; -import edu.harvard.iq.dataverse.datavariable.VariableRange; -import edu.harvard.iq.dataverse.datavariable.SummaryStatistic; -import edu.harvard.iq.dataverse.datavariable.VariableCategory; -import edu.harvard.iq.dataverse.datavariable.VarGroup; -import edu.harvard.iq.dataverse.datavariable.CategoryMetadata; import static edu.harvard.iq.dataverse.export.DDIExportServiceBean.LEVEL_FILE; import static edu.harvard.iq.dataverse.export.DDIExportServiceBean.NOTE_SUBJECT_TAG; @@ -34,42 +21,35 @@ import edu.harvard.iq.dataverse.settings.SettingsServiceBean; -import edu.harvard.iq.dataverse.util.BundleUtil; -import edu.harvard.iq.dataverse.util.FileUtil; import edu.harvard.iq.dataverse.util.SystemConfig; -import edu.harvard.iq.dataverse.util.json.JsonPrinter; import edu.harvard.iq.dataverse.util.json.JsonUtil; import edu.harvard.iq.dataverse.util.xml.XmlPrinter; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.nio.file.Files; -import java.nio.file.Path; import java.nio.file.Paths; import java.time.LocalDate; import java.util.*; import java.util.Map.Entry; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObject; -import javax.json.JsonValue; +import jakarta.ejb.EJB; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; +import jakarta.json.JsonValue; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.FactoryConfigurationError; import javax.xml.parsers.ParserConfigurationException; import org.xml.sax.SAXException; -import org.xml.sax.SAXParseException; import org.w3c.dom.Document; import org.apache.commons.lang3.StringUtils; -import org.w3c.dom.DOMException; // For write operation import javax.xml.transform.Transformer; @@ -79,9 +59,7 @@ import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamSource; import javax.xml.transform.stream.StreamResult; -import java.io.File; import java.io.InputStream; -import java.io.InputStreamReader; public class DdiExportUtil { diff --git a/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtilHelper.java b/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtilHelper.java index 149c6791a7e..d0cd8a4cae7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtilHelper.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtilHelper.java @@ -1,9 +1,9 @@ package edu.harvard.iq.dataverse.export.ddi; -import javax.annotation.PostConstruct; -import javax.ejb.EJB; -import javax.ejb.Singleton; -import javax.ejb.Startup; +import jakarta.annotation.PostConstruct; +import jakarta.ejb.EJB; +import jakarta.ejb.Singleton; +import jakarta.ejb.Startup; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; diff --git a/src/main/java/edu/harvard/iq/dataverse/export/dublincore/DublinCoreExportUtil.java b/src/main/java/edu/harvard/iq/dataverse/export/dublincore/DublinCoreExportUtil.java index 238cea78fb5..6b7cb844f3e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/dublincore/DublinCoreExportUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/dublincore/DublinCoreExportUtil.java @@ -14,18 +14,16 @@ import edu.harvard.iq.dataverse.api.dto.LicenseDTO; import edu.harvard.iq.dataverse.api.dto.MetadataBlockDTO; import edu.harvard.iq.dataverse.export.ddi.DdiExportUtil; -import edu.harvard.iq.dataverse.license.License; import edu.harvard.iq.dataverse.pidproviders.PidUtil; import edu.harvard.iq.dataverse.util.json.JsonUtil; -import java.io.ByteArrayOutputStream; + import java.io.OutputStream; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.logging.Level; import java.util.logging.Logger; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; diff --git a/src/main/java/edu/harvard/iq/dataverse/export/openaire/OpenAireExportUtil.java b/src/main/java/edu/harvard/iq/dataverse/export/openaire/OpenAireExportUtil.java index 6e1e61ebd06..f7e75ca03fa 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/openaire/OpenAireExportUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/openaire/OpenAireExportUtil.java @@ -8,7 +8,7 @@ import java.util.Set; import java.util.logging.Logger; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; @@ -21,7 +21,6 @@ import edu.harvard.iq.dataverse.DatasetFieldConstant; import edu.harvard.iq.dataverse.GlobalId; import edu.harvard.iq.dataverse.HandlenetServiceBean; -import edu.harvard.iq.dataverse.TermsOfUseAndAccess; import edu.harvard.iq.dataverse.api.dto.DatasetDTO; import edu.harvard.iq.dataverse.api.dto.DatasetVersionDTO; import edu.harvard.iq.dataverse.api.dto.FieldDTO; @@ -31,8 +30,8 @@ import edu.harvard.iq.dataverse.util.json.JsonUtil; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.mail.internet.AddressException; -import javax.mail.internet.InternetAddress; +import jakarta.mail.internet.AddressException; +import jakarta.mail.internet.InternetAddress; public class OpenAireExportUtil { diff --git a/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalTool.java b/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalTool.java index 0a238eb5198..670e1ea68ed 100644 --- a/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalTool.java +++ b/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalTool.java @@ -6,20 +6,20 @@ import java.io.Serializable; import java.util.Arrays; import java.util.List; -import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObjectBuilder; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.OneToMany; + +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObjectBuilder; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToMany; /** * A specification or definition for how an external tool is intended to diff --git a/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalToolHandler.java b/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalToolHandler.java index dac046373ba..a52679deebc 100644 --- a/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalToolHandler.java +++ b/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalToolHandler.java @@ -22,15 +22,15 @@ import java.util.logging.Level; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonArrayBuilder; -import javax.json.JsonNumber; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.JsonString; -import javax.json.JsonValue; -import javax.ws.rs.HttpMethod; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonNumber; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; +import jakarta.ws.rs.HttpMethod; import org.apache.commons.codec.binary.StringUtils; diff --git a/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalToolServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalToolServiceBean.java index f38cd7301ee..5f912335d21 100644 --- a/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalToolServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalToolServiceBean.java @@ -6,34 +6,31 @@ import edu.harvard.iq.dataverse.DataFileServiceBean; import edu.harvard.iq.dataverse.authorization.users.ApiToken; import edu.harvard.iq.dataverse.externaltools.ExternalTool.Type; -import edu.harvard.iq.dataverse.util.URLTokenUtil; import edu.harvard.iq.dataverse.util.URLTokenUtil.ReservedWord; import edu.harvard.iq.dataverse.util.json.JsonUtil; import edu.harvard.iq.dataverse.externaltools.ExternalTool.Scope; -import java.io.StringReader; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.logging.Logger; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.JsonReader; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.NonUniqueResultException; -import javax.persistence.PersistenceContext; -import javax.persistence.TypedQuery; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonReader; +import jakarta.persistence.EntityManager; +import jakarta.persistence.NoResultException; +import jakarta.persistence.NonUniqueResultException; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.TypedQuery; import static edu.harvard.iq.dataverse.externaltools.ExternalTool.*; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import javax.ejb.EJB; -import javax.json.JsonValue; + +import jakarta.ejb.EJB; +import jakarta.json.JsonValue; @Stateless @Named diff --git a/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalToolType.java b/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalToolType.java index 3564d1871b5..fb4c0f5dc5d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalToolType.java +++ b/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalToolType.java @@ -1,18 +1,18 @@ package edu.harvard.iq.dataverse.externaltools; import java.io.Serializable; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; @Entity @Table(indexes = { diff --git a/src/main/java/edu/harvard/iq/dataverse/feedback/Feedback.java b/src/main/java/edu/harvard/iq/dataverse/feedback/Feedback.java index c9acb491aa2..c1162eb8db6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/feedback/Feedback.java +++ b/src/main/java/edu/harvard/iq/dataverse/feedback/Feedback.java @@ -1,7 +1,7 @@ package edu.harvard.iq.dataverse.feedback; -import javax.json.Json; -import javax.json.JsonObjectBuilder; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; import edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder; diff --git a/src/main/java/edu/harvard/iq/dataverse/feedback/FeedbackUtil.java b/src/main/java/edu/harvard/iq/dataverse/feedback/FeedbackUtil.java index 750a3923806..6ae0e165141 100644 --- a/src/main/java/edu/harvard/iq/dataverse/feedback/FeedbackUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/feedback/FeedbackUtil.java @@ -17,8 +17,8 @@ import java.util.List; import java.util.logging.Logger; -import javax.json.JsonObject; -import javax.mail.internet.InternetAddress; +import jakarta.json.JsonObject; +import jakarta.mail.internet.InternetAddress; public class FeedbackUtil { diff --git a/src/main/java/edu/harvard/iq/dataverse/flyway/StartupFlywayMigrator.java b/src/main/java/edu/harvard/iq/dataverse/flyway/StartupFlywayMigrator.java index 71b53bd43f2..39bc46216ca 100644 --- a/src/main/java/edu/harvard/iq/dataverse/flyway/StartupFlywayMigrator.java +++ b/src/main/java/edu/harvard/iq/dataverse/flyway/StartupFlywayMigrator.java @@ -2,12 +2,12 @@ import org.flywaydb.core.Flyway; -import javax.annotation.PostConstruct; -import javax.annotation.Resource; -import javax.ejb.Singleton; -import javax.ejb.Startup; -import javax.ejb.TransactionManagement; -import javax.ejb.TransactionManagementType; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import jakarta.ejb.Singleton; +import jakarta.ejb.Startup; +import jakarta.ejb.TransactionManagement; +import jakarta.ejb.TransactionManagementType; import javax.sql.DataSource; @Startup diff --git a/src/main/java/edu/harvard/iq/dataverse/globus/GlobusServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/globus/GlobusServiceBean.java index 9d80c5cc280..d2613422be9 100644 --- a/src/main/java/edu/harvard/iq/dataverse/globus/GlobusServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/globus/GlobusServiceBean.java @@ -4,19 +4,19 @@ import com.google.gson.GsonBuilder; import edu.harvard.iq.dataverse.*; -import javax.ejb.Asynchronous; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.ejb.TransactionAttribute; -import javax.ejb.TransactionAttributeType; -import javax.inject.Inject; -import javax.inject.Named; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObject; -import javax.json.JsonPatch; -import javax.servlet.http.HttpServletRequest; +import jakarta.ejb.Asynchronous; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.ejb.TransactionAttribute; +import jakarta.ejb.TransactionAttributeType; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; +import jakarta.json.JsonPatch; +import jakarta.servlet.http.HttpServletRequest; import static edu.harvard.iq.dataverse.util.json.JsonPrinter.json; import static edu.harvard.iq.dataverse.util.json.JsonPrinter.toJsonArray; diff --git a/src/main/java/edu/harvard/iq/dataverse/harvest/client/ClientHarvestRun.java b/src/main/java/edu/harvard/iq/dataverse/harvest/client/ClientHarvestRun.java index 50d06807a13..ba6f5c3dec2 100644 --- a/src/main/java/edu/harvard/iq/dataverse/harvest/client/ClientHarvestRun.java +++ b/src/main/java/edu/harvard/iq/dataverse/harvest/client/ClientHarvestRun.java @@ -7,14 +7,14 @@ import java.io.Serializable; 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.ManyToOne; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; +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.Temporal; +import jakarta.persistence.TemporalType; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/harvest/client/HarvesterServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/harvest/client/HarvesterServiceBean.java index 40bd45ecb30..8e80fcb78bf 100644 --- a/src/main/java/edu/harvard/iq/dataverse/harvest/client/HarvesterServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/harvest/client/HarvesterServiceBean.java @@ -21,13 +21,13 @@ import java.util.logging.FileHandler; import java.util.logging.Level; import java.util.logging.Logger; -import javax.annotation.Resource; -import javax.ejb.Asynchronous; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.ejb.Stateless; -import javax.ejb.Timer; -import javax.inject.Named; +import jakarta.annotation.Resource; +import jakarta.ejb.Asynchronous; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.ejb.Stateless; +import jakarta.ejb.Timer; +import jakarta.inject.Named; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.TransformerException; import org.apache.commons.lang3.mutable.MutableBoolean; @@ -51,8 +51,8 @@ import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.Path; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; /** * @@ -69,7 +69,7 @@ public class HarvesterServiceBean { @EJB DatasetServiceBean datasetService; @Resource - javax.ejb.TimerService timerService; + jakarta.ejb.TimerService timerService; @EJB DataverseTimerServiceBean dataverseTimerService; @EJB diff --git a/src/main/java/edu/harvard/iq/dataverse/harvest/client/HarvestingClient.java b/src/main/java/edu/harvard/iq/dataverse/harvest/client/HarvestingClient.java index d27ddc41b7f..40db55f2a0c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/harvest/client/HarvestingClient.java +++ b/src/main/java/edu/harvard/iq/dataverse/harvest/client/HarvestingClient.java @@ -17,25 +17,25 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.OneToMany; -import javax.persistence.OneToOne; -import javax.persistence.OrderBy; -import javax.persistence.Table; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; -import javax.validation.constraints.Pattern; -import javax.validation.constraints.Size; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OneToOne; +import jakarta.persistence.OrderBy; +import jakarta.persistence.Table; +import jakarta.persistence.Temporal; +import jakarta.persistence.TemporalType; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; import org.hibernate.validator.constraints.NotBlank; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/harvest/client/HarvestingClientServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/harvest/client/HarvestingClientServiceBean.java index 13cc44ce919..7ec6d75a41c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/harvest/client/HarvestingClientServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/harvest/client/HarvestingClientServiceBean.java @@ -5,25 +5,23 @@ import edu.harvard.iq.dataverse.DataverseRequestServiceBean; import edu.harvard.iq.dataverse.DataverseServiceBean; import edu.harvard.iq.dataverse.EjbDataverseEngine; -import edu.harvard.iq.dataverse.engine.command.exception.CommandException; -import edu.harvard.iq.dataverse.engine.command.impl.DeleteHarvestingClientCommand; import edu.harvard.iq.dataverse.search.IndexServiceBean; import edu.harvard.iq.dataverse.timer.DataverseTimerServiceBean; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.logging.Logger; -import javax.ejb.Asynchronous; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.ejb.TransactionAttribute; -import javax.ejb.TransactionAttributeType; -import javax.inject.Inject; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.NonUniqueResultException; -import javax.persistence.PersistenceContext; +import jakarta.ejb.Asynchronous; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.ejb.TransactionAttribute; +import jakarta.ejb.TransactionAttributeType; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.NoResultException; +import jakarta.persistence.NonUniqueResultException; +import jakarta.persistence.PersistenceContext; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/harvest/server/OAIRecord.java b/src/main/java/edu/harvard/iq/dataverse/harvest/server/OAIRecord.java index 49e40e786ea..94753d8594d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/harvest/server/OAIRecord.java +++ b/src/main/java/edu/harvard/iq/dataverse/harvest/server/OAIRecord.java @@ -21,12 +21,12 @@ import java.io.Serializable; import java.util.Date; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Temporal; +import jakarta.persistence.TemporalType; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/harvest/server/OAIRecordServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/harvest/server/OAIRecordServiceBean.java index e73dbb9fc07..1b4a7bc7db0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/harvest/server/OAIRecordServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/harvest/server/OAIRecordServiceBean.java @@ -13,27 +13,22 @@ import edu.harvard.iq.dataverse.search.IndexServiceBean; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import java.time.Instant; -import java.io.File; -import java.io.IOException; -import java.sql.Timestamp; -import java.text.SimpleDateFormat; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.logging.FileHandler; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.ejb.TransactionAttribute; -import static javax.ejb.TransactionAttributeType.REQUIRES_NEW; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.TypedQuery; -import javax.persistence.TemporalType; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.ejb.TransactionAttribute; +import static jakarta.ejb.TransactionAttributeType.REQUIRES_NEW; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.TypedQuery; +import jakarta.persistence.TemporalType; /** * @@ -265,7 +260,7 @@ public OAIRecord findOAIRecordBySetNameandGlobalId(String setName, String global try { oaiRecord = (OAIRecord) query.setMaxResults(1).getSingleResult(); - } catch (javax.persistence.NoResultException e) { + } catch (jakarta.persistence.NoResultException e) { // Do nothing, just return null. } logger.fine("returning oai record."); diff --git a/src/main/java/edu/harvard/iq/dataverse/harvest/server/OAISet.java b/src/main/java/edu/harvard/iq/dataverse/harvest/server/OAISet.java index 038bb66de32..8d6b04effef 100644 --- a/src/main/java/edu/harvard/iq/dataverse/harvest/server/OAISet.java +++ b/src/main/java/edu/harvard/iq/dataverse/harvest/server/OAISet.java @@ -20,16 +20,16 @@ package edu.harvard.iq.dataverse.harvest.server; import java.io.Serializable; -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.OneToOne; -import javax.persistence.Version; -import javax.validation.constraints.Pattern; -import javax.validation.constraints.Size; +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.OneToOne; +import jakarta.persistence.Version; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/harvest/server/OAISetServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/harvest/server/OAISetServiceBean.java index 6b28c8808a0..ee4475e12c8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/harvest/server/OAISetServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/harvest/server/OAISetServiceBean.java @@ -17,18 +17,16 @@ import java.util.logging.FileHandler; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.Asynchronous; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.ejb.TransactionAttribute; -import javax.ejb.TransactionAttributeType; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import org.apache.solr.client.solrj.SolrClient; +import jakarta.ejb.Asynchronous; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.ejb.TransactionAttribute; +import jakarta.ejb.TransactionAttributeType; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; -import org.apache.solr.client.solrj.impl.HttpSolrClient; import org.apache.solr.client.solrj.impl.HttpSolrClient.RemoteSolrException; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; diff --git a/src/main/java/edu/harvard/iq/dataverse/harvest/server/web/servlet/OAIServlet.java b/src/main/java/edu/harvard/iq/dataverse/harvest/server/web/servlet/OAIServlet.java index 9cf1629abfc..96a19acc0e8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/harvest/server/web/servlet/OAIServlet.java +++ b/src/main/java/edu/harvard/iq/dataverse/harvest/server/web/servlet/OAIServlet.java @@ -38,17 +38,16 @@ import java.io.IOException; -import java.time.Instant; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.inject.Inject; +import jakarta.ejb.EJB; +import jakarta.inject.Inject; import org.eclipse.microprofile.config.inject.ConfigProperty; -import javax.mail.internet.InternetAddress; -import javax.servlet.ServletConfig; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.mail.internet.InternetAddress; +import jakarta.servlet.ServletConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import javax.xml.stream.XMLStreamException; import org.eclipse.microprofile.config.Config; import org.eclipse.microprofile.config.ConfigProvider; diff --git a/src/main/java/edu/harvard/iq/dataverse/ingest/IngestMessageBean.java b/src/main/java/edu/harvard/iq/dataverse/ingest/IngestMessageBean.java index 77ec6701bc6..eef325fe4ec 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ingest/IngestMessageBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/ingest/IngestMessageBean.java @@ -29,15 +29,15 @@ import java.time.Instant; import java.util.Iterator; import java.util.logging.Logger; -import javax.ejb.ActivationConfigProperty; -import javax.ejb.EJB; -import javax.ejb.MessageDriven; -import javax.ejb.TransactionAttribute; -import javax.ejb.TransactionAttributeType; -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.MessageListener; -import javax.jms.ObjectMessage; +import jakarta.ejb.ActivationConfigProperty; +import jakarta.ejb.EJB; +import jakarta.ejb.MessageDriven; +import jakarta.ejb.TransactionAttribute; +import jakarta.ejb.TransactionAttributeType; +import jakarta.jms.JMSException; +import jakarta.jms.Message; +import jakarta.jms.MessageListener; +import jakarta.jms.ObjectMessage; /** * * This is an experimental, JMS-based implementation of asynchronous diff --git a/src/main/java/edu/harvard/iq/dataverse/ingest/IngestQueueProducer.java b/src/main/java/edu/harvard/iq/dataverse/ingest/IngestQueueProducer.java index 1ba63207208..39283adea49 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ingest/IngestQueueProducer.java +++ b/src/main/java/edu/harvard/iq/dataverse/ingest/IngestQueueProducer.java @@ -1,13 +1,13 @@ package edu.harvard.iq.dataverse.ingest; -import javax.annotation.Resource; +import jakarta.annotation.Resource; // https://www.baeldung.com/jee-cdi-vs-ejb-singleton -import javax.inject.Singleton; -import javax.enterprise.inject.Produces; -import javax.jms.JMSConnectionFactoryDefinition; -import javax.jms.JMSDestinationDefinition; -import javax.jms.Queue; -import javax.jms.QueueConnectionFactory; +import jakarta.inject.Singleton; +import jakarta.enterprise.inject.Produces; +import jakarta.jms.JMSConnectionFactoryDefinition; +import jakarta.jms.JMSDestinationDefinition; +import jakarta.jms.Queue; +import jakarta.jms.QueueConnectionFactory; @JMSConnectionFactoryDefinition( description = "Dataverse Ingest Queue Factory", diff --git a/src/main/java/edu/harvard/iq/dataverse/ingest/IngestReport.java b/src/main/java/edu/harvard/iq/dataverse/ingest/IngestReport.java index 31208abf839..a1a8bde77f4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ingest/IngestReport.java +++ b/src/main/java/edu/harvard/iq/dataverse/ingest/IngestReport.java @@ -9,17 +9,17 @@ import edu.harvard.iq.dataverse.DataFile; import java.io.Serializable; import java.util.Date; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.Lob; -import javax.persistence.ManyToOne; -import javax.persistence.Table; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.Lob; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import jakarta.persistence.Temporal; +import jakarta.persistence.TemporalType; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/ingest/IngestRequest.java b/src/main/java/edu/harvard/iq/dataverse/ingest/IngestRequest.java index 024e90325c3..a5d6a1af75c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ingest/IngestRequest.java +++ b/src/main/java/edu/harvard/iq/dataverse/ingest/IngestRequest.java @@ -7,16 +7,16 @@ import edu.harvard.iq.dataverse.DataFile; import java.io.Serializable; -import javax.persistence.CascadeType; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.OneToOne; -import javax.persistence.Table; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/ingest/IngestServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/ingest/IngestServiceBean.java index 0bbbfb3cb24..7de2e4f89e0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ingest/IngestServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/ingest/IngestServiceBean.java @@ -105,20 +105,20 @@ import java.util.ListIterator; import java.util.logging.Logger; import java.util.Hashtable; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.jms.Queue; -import javax.jms.QueueConnectionFactory; -import javax.annotation.Resource; -import javax.ejb.Asynchronous; -import javax.jms.JMSException; -import javax.jms.QueueConnection; -import javax.jms.QueueSender; -import javax.jms.QueueSession; -import javax.jms.Message; -import javax.faces.application.FacesMessage; -import javax.ws.rs.core.MediaType; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.jms.Queue; +import jakarta.jms.QueueConnectionFactory; +import jakarta.annotation.Resource; +import jakarta.ejb.Asynchronous; +import jakarta.jms.JMSException; +import jakarta.jms.QueueConnection; +import jakarta.jms.QueueSender; +import jakarta.jms.QueueSession; +import jakarta.jms.Message; +import jakarta.faces.application.FacesMessage; +import jakarta.ws.rs.core.MediaType; import ucar.nc2.NetcdfFile; import ucar.nc2.NetcdfFiles; diff --git a/src/main/java/edu/harvard/iq/dataverse/ingest/IngestUtil.java b/src/main/java/edu/harvard/iq/dataverse/ingest/IngestUtil.java index 368824680c0..3d30f7e6ec3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ingest/IngestUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/ingest/IngestUtil.java @@ -20,15 +20,12 @@ package edu.harvard.iq.dataverse.ingest; import edu.harvard.iq.dataverse.DataFile; -import edu.harvard.iq.dataverse.Dataset; import edu.harvard.iq.dataverse.DatasetVersion; import edu.harvard.iq.dataverse.FileMetadata; import edu.harvard.iq.dataverse.util.FileUtil; import java.io.File; -import java.io.FileWriter; import java.io.IOException; -import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; @@ -36,9 +33,9 @@ import java.util.List; import java.util.Set; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObjectBuilder; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObjectBuilder; import org.dataverse.unf.UNFUtil; import org.dataverse.unf.UnfException; diff --git a/src/main/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/rdata/RDATAFileReader.java b/src/main/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/rdata/RDATAFileReader.java index 6d17a5bd553..eb1353fd792 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/rdata/RDATAFileReader.java +++ b/src/main/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/rdata/RDATAFileReader.java @@ -21,14 +21,12 @@ import java.io.*; -import java.io.FileReader; import java.io.InputStreamReader; import java.text.*; import java.util.logging.*; import java.util.*; -import java.security.NoSuchAlgorithmException; -import javax.inject.Inject; +import jakarta.inject.Inject; // Rosuda Wrappers and Methods for R-calls to Rserve import edu.harvard.iq.dataverse.settings.JvmSettings; @@ -43,18 +41,14 @@ import edu.harvard.iq.dataverse.datavariable.DataVariable; import edu.harvard.iq.dataverse.datavariable.VariableCategory; -import edu.harvard.iq.dataverse.ingest.plugin.spi.*; import edu.harvard.iq.dataverse.ingest.tabulardata.TabularDataFileReader; import edu.harvard.iq.dataverse.ingest.tabulardata.spi.TabularDataFileReaderSpi; import edu.harvard.iq.dataverse.ingest.tabulardata.TabularDataIngest; import edu.harvard.iq.dataverse.rserve.*; -import javax.naming.Context; -import javax.naming.InitialContext; -import javax.naming.NamingException; import org.apache.commons.lang3.RandomStringUtils; -import org.apache.commons.lang3.ArrayUtils; + /** * Dataverse 4.0 implementation of TabularDataFileReader for the * RData Binary Format. diff --git a/src/main/java/edu/harvard/iq/dataverse/license/License.java b/src/main/java/edu/harvard/iq/dataverse/license/License.java index c6e2cdbc2e5..fe19073ab8d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/license/License.java +++ b/src/main/java/edu/harvard/iq/dataverse/license/License.java @@ -1,15 +1,15 @@ package edu.harvard.iq.dataverse.license; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.OneToMany; -import javax.persistence.Table; -import javax.persistence.UniqueConstraint; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import jakarta.persistence.UniqueConstraint; import edu.harvard.iq.dataverse.TermsOfUseAndAccess; diff --git a/src/main/java/edu/harvard/iq/dataverse/license/LicenseConverter.java b/src/main/java/edu/harvard/iq/dataverse/license/LicenseConverter.java index 4f874132128..26b7ca63a29 100644 --- a/src/main/java/edu/harvard/iq/dataverse/license/LicenseConverter.java +++ b/src/main/java/edu/harvard/iq/dataverse/license/LicenseConverter.java @@ -6,11 +6,11 @@ package edu.harvard.iq.dataverse.license; -import javax.enterprise.inject.spi.CDI; -import javax.faces.component.UIComponent; -import javax.faces.context.FacesContext; -import javax.faces.convert.Converter; -import javax.faces.convert.FacesConverter; +import jakarta.enterprise.inject.spi.CDI; +import jakarta.faces.component.UIComponent; +import jakarta.faces.context.FacesContext; +import jakarta.faces.convert.Converter; +import jakarta.faces.convert.FacesConverter; @FacesConverter("licenseConverter") public class LicenseConverter implements Converter { diff --git a/src/main/java/edu/harvard/iq/dataverse/license/LicenseServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/license/LicenseServiceBean.java index 9704e4b92dc..93f4958038c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/license/LicenseServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/license/LicenseServiceBean.java @@ -5,13 +5,13 @@ import edu.harvard.iq.dataverse.api.AbstractApiBean.WrappedResponse; import static edu.harvard.iq.dataverse.dataset.DatasetUtil.getLocalizedLicenseName; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.PersistenceContext; -import javax.persistence.PersistenceException; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.NoResultException; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.PersistenceException; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; diff --git a/src/main/java/edu/harvard/iq/dataverse/locality/DvObjectStorageLocation.java b/src/main/java/edu/harvard/iq/dataverse/locality/DvObjectStorageLocation.java index 33486128e7b..5844c8b6ab9 100644 --- a/src/main/java/edu/harvard/iq/dataverse/locality/DvObjectStorageLocation.java +++ b/src/main/java/edu/harvard/iq/dataverse/locality/DvObjectStorageLocation.java @@ -2,11 +2,11 @@ import edu.harvard.iq.dataverse.DvObject; import java.io.Serializable; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.OneToOne; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToOne; /** * Future use, maybe. Once we're happy with the design we'll enable it as an diff --git a/src/main/java/edu/harvard/iq/dataverse/locality/StorageSite.java b/src/main/java/edu/harvard/iq/dataverse/locality/StorageSite.java index d873b9f8989..c074cb5918f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/locality/StorageSite.java +++ b/src/main/java/edu/harvard/iq/dataverse/locality/StorageSite.java @@ -2,13 +2,13 @@ import java.io.Serializable; import java.util.Objects; -import javax.json.Json; -import javax.json.JsonObjectBuilder; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; @Entity public class StorageSite implements Serializable { diff --git a/src/main/java/edu/harvard/iq/dataverse/locality/StorageSiteServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/locality/StorageSiteServiceBean.java index c7057ab9318..781e896e9a7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/locality/StorageSiteServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/locality/StorageSiteServiceBean.java @@ -2,12 +2,12 @@ import java.util.List; import java.util.logging.Logger; -import javax.ejb.Stateless; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.NonUniqueResultException; -import javax.persistence.PersistenceContext; -import javax.persistence.TypedQuery; +import jakarta.ejb.Stateless; +import jakarta.persistence.EntityManager; +import jakarta.persistence.NoResultException; +import jakarta.persistence.NonUniqueResultException; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.TypedQuery; @Stateless public class StorageSiteServiceBean { diff --git a/src/main/java/edu/harvard/iq/dataverse/locality/StorageSiteUtil.java b/src/main/java/edu/harvard/iq/dataverse/locality/StorageSiteUtil.java index ebc2bb0f19f..6ff0f7ca379 100644 --- a/src/main/java/edu/harvard/iq/dataverse/locality/StorageSiteUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/locality/StorageSiteUtil.java @@ -2,7 +2,7 @@ import edu.harvard.iq.dataverse.util.SystemConfig; import java.util.List; -import javax.json.JsonObject; +import jakarta.json.JsonObject; public class StorageSiteUtil { diff --git a/src/main/java/edu/harvard/iq/dataverse/makedatacount/DatasetExternalCitations.java b/src/main/java/edu/harvard/iq/dataverse/makedatacount/DatasetExternalCitations.java index 3c1c0bc0c68..469f3abe9da 100644 --- a/src/main/java/edu/harvard/iq/dataverse/makedatacount/DatasetExternalCitations.java +++ b/src/main/java/edu/harvard/iq/dataverse/makedatacount/DatasetExternalCitations.java @@ -7,14 +7,14 @@ import edu.harvard.iq.dataverse.Dataset; import java.io.Serializable; -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.validation.constraints.NotNull; +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.validation.constraints.NotNull; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/makedatacount/DatasetExternalCitationsServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/makedatacount/DatasetExternalCitationsServiceBean.java index c05fc9b1a4e..50c24274bb2 100644 --- a/src/main/java/edu/harvard/iq/dataverse/makedatacount/DatasetExternalCitationsServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/makedatacount/DatasetExternalCitationsServiceBean.java @@ -10,16 +10,16 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.json.JsonArray; -import javax.json.JsonObject; -import javax.json.JsonValue; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import jakarta.json.JsonValue; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/makedatacount/DatasetMetrics.java b/src/main/java/edu/harvard/iq/dataverse/makedatacount/DatasetMetrics.java index fe0565c3ff8..ac3dff356eb 100644 --- a/src/main/java/edu/harvard/iq/dataverse/makedatacount/DatasetMetrics.java +++ b/src/main/java/edu/harvard/iq/dataverse/makedatacount/DatasetMetrics.java @@ -3,15 +3,15 @@ import edu.harvard.iq.dataverse.Dataset; import java.io.Serializable; -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.Transient; -import javax.validation.constraints.NotNull; +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.Transient; +import jakarta.validation.constraints.NotNull; /** * Cached versions of views, downloads, and citations to show in the UI and API. diff --git a/src/main/java/edu/harvard/iq/dataverse/makedatacount/DatasetMetricsServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/makedatacount/DatasetMetricsServiceBean.java index 39afdf318ad..0925c164bf4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/makedatacount/DatasetMetricsServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/makedatacount/DatasetMetricsServiceBean.java @@ -5,26 +5,23 @@ import edu.harvard.iq.dataverse.DatasetServiceBean; import java.io.StringReader; import java.math.BigDecimal; -import java.sql.Timestamp; import java.util.ArrayList; -import java.util.Date; import java.util.List; import java.util.ListIterator; import java.util.Set; -import java.util.concurrent.Future; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonObject; -import javax.json.JsonReader; -import javax.json.JsonValue; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; +import jakarta.json.JsonValue; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/makedatacount/MakeDataCountLoggingServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/makedatacount/MakeDataCountLoggingServiceBean.java index e1a635a9d6c..5edf2fde0c3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/makedatacount/MakeDataCountLoggingServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/makedatacount/MakeDataCountLoggingServiceBean.java @@ -16,14 +16,14 @@ import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; -import javax.ejb.EJB; -import javax.enterprise.context.RequestScoped; -import javax.faces.context.FacesContext; -import javax.inject.Named; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.UriInfo; +import jakarta.ejb.EJB; +import jakarta.enterprise.context.RequestScoped; +import jakarta.faces.context.FacesContext; +import jakarta.inject.Named; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.UriInfo; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/makedatacount/MakeDataCountUtil.java b/src/main/java/edu/harvard/iq/dataverse/makedatacount/MakeDataCountUtil.java index f3d45642083..8f32750f090 100644 --- a/src/main/java/edu/harvard/iq/dataverse/makedatacount/MakeDataCountUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/makedatacount/MakeDataCountUtil.java @@ -1,17 +1,16 @@ package edu.harvard.iq.dataverse.makedatacount; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.json.JsonArray; -import javax.json.JsonObject; -import javax.json.JsonValue; -import javax.persistence.Transient; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import jakarta.json.JsonValue; +import jakarta.persistence.Transient; /** * See doc/sphinx-guides/source/admin/make-data-count.rst for user facing docs diff --git a/src/main/java/edu/harvard/iq/dataverse/metadataimport/ForeignMetadataImportServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/metadataimport/ForeignMetadataImportServiceBean.java index 88af8478a8f..33f8277919a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/metadataimport/ForeignMetadataImportServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/metadataimport/ForeignMetadataImportServiceBean.java @@ -2,7 +2,6 @@ package edu.harvard.iq.dataverse.metadataimport; -import edu.harvard.iq.dataverse.ControlledVocabularyValue; import edu.harvard.iq.dataverse.DatasetVersion; import edu.harvard.iq.dataverse.DatasetField; import edu.harvard.iq.dataverse.DatasetFieldCompoundValue; @@ -17,13 +16,13 @@ import java.io.IOException; import java.util.logging.Logger; import java.io.StringReader; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.PersistenceContext; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.persistence.EntityManager; +import jakarta.persistence.NoResultException; +import jakarta.persistence.PersistenceContext; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; diff --git a/src/main/java/edu/harvard/iq/dataverse/metrics/MetricsServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/metrics/MetricsServiceBean.java index ff5ffee8f85..4ef8d630bf6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/metrics/MetricsServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/metrics/MetricsServiceBean.java @@ -3,7 +3,6 @@ import edu.harvard.iq.dataverse.DatasetVersion; import edu.harvard.iq.dataverse.Dataverse; import edu.harvard.iq.dataverse.Metric; -import edu.harvard.iq.dataverse.makedatacount.DatasetMetrics; import edu.harvard.iq.dataverse.makedatacount.MakeDataCountUtil.MetricType; import static edu.harvard.iq.dataverse.metrics.MetricsUtil.*; @@ -23,19 +22,19 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.NonUniqueResultException; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import javax.ws.rs.core.UriInfo; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.persistence.EntityManager; +import jakarta.persistence.NoResultException; +import jakarta.persistence.NonUniqueResultException; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; +import jakarta.ws.rs.core.UriInfo; @Stateless public class MetricsServiceBean implements Serializable { @@ -383,7 +382,7 @@ public JsonArray filesByType(Dataverse d) { jab.add(stats); } - } catch (javax.persistence.NoResultException nr) { + } catch (jakarta.persistence.NoResultException nr) { // do nothing } return jab.build(); @@ -519,7 +518,7 @@ public JsonArray fileDownloads(String yyyymm, Dataverse d, boolean uniqueCounts) job.add(MetricsUtil.COUNT, (long) result[2]); jab.add(job); } - } catch (javax.persistence.NoResultException nr) { + } catch (jakarta.persistence.NoResultException nr) { // do nothing } return jab.build(); @@ -558,7 +557,7 @@ public JsonArray uniqueDatasetDownloads(String yyyymm, Dataverse d) { jab.add(job); } - } catch (javax.persistence.NoResultException nr) { + } catch (jakarta.persistence.NoResultException nr) { // do nothing } return jab.build(); @@ -718,7 +717,7 @@ public Metric getMetric(String name, String dataLocation, String dayString, Data Metric metric = null; try { metric = (Metric) query.getSingleResult(); - } catch (javax.persistence.NoResultException nr) { + } catch (jakarta.persistence.NoResultException nr) { // do nothing logger.fine("No result"); } catch (NonUniqueResultException nur) { diff --git a/src/main/java/edu/harvard/iq/dataverse/metrics/MetricsUtil.java b/src/main/java/edu/harvard/iq/dataverse/metrics/MetricsUtil.java index 72d8f5402bb..74bb53e1191 100644 --- a/src/main/java/edu/harvard/iq/dataverse/metrics/MetricsUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/metrics/MetricsUtil.java @@ -6,21 +6,19 @@ import java.time.LocalDate; import java.time.YearMonth; import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeFormatterBuilder; import java.time.format.DateTimeParseException; -import java.time.temporal.ChronoField; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.JsonReader; -import javax.ws.rs.BadRequestException; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonReader; +import jakarta.ws.rs.BadRequestException; public class MetricsUtil { diff --git a/src/main/java/edu/harvard/iq/dataverse/mydata/DataRetrieverAPI.java b/src/main/java/edu/harvard/iq/dataverse/mydata/DataRetrieverAPI.java index d244021d01a..e9898031343 100644 --- a/src/main/java/edu/harvard/iq/dataverse/mydata/DataRetrieverAPI.java +++ b/src/main/java/edu/harvard/iq/dataverse/mydata/DataRetrieverAPI.java @@ -25,25 +25,23 @@ import edu.harvard.iq.dataverse.search.SearchException; import edu.harvard.iq.dataverse.search.SearchFields; import edu.harvard.iq.dataverse.search.SortBy; -import java.math.BigDecimal; -import java.util.Arrays; + import java.util.List; import java.util.Map; -import java.util.Random; import java.util.logging.Logger; import java.util.Locale; -import javax.ejb.EJB; -import javax.inject.Inject; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObjectBuilder; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.core.Context; +import jakarta.ejb.EJB; +import jakarta.inject.Inject; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObjectBuilder; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.core.Context; import edu.harvard.iq.dataverse.util.BundleUtil; import org.apache.commons.lang3.StringUtils; diff --git a/src/main/java/edu/harvard/iq/dataverse/mydata/MyDataFilterParams.java b/src/main/java/edu/harvard/iq/dataverse/mydata/MyDataFilterParams.java index c378034f951..2ab248fcc0b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/mydata/MyDataFilterParams.java +++ b/src/main/java/edu/harvard/iq/dataverse/mydata/MyDataFilterParams.java @@ -17,9 +17,9 @@ import java.util.HashMap; import java.util.List; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObjectBuilder; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObjectBuilder; import org.apache.commons.lang3.StringUtils; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/mydata/MyDataFinder.java b/src/main/java/edu/harvard/iq/dataverse/mydata/MyDataFinder.java index 6acdfd9cdde..917884f3549 100644 --- a/src/main/java/edu/harvard/iq/dataverse/mydata/MyDataFinder.java +++ b/src/main/java/edu/harvard/iq/dataverse/mydata/MyDataFinder.java @@ -18,9 +18,9 @@ import java.util.Map; import java.util.Set; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObjectBuilder; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObjectBuilder; import org.apache.commons.lang3.StringUtils; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/mydata/MyDataPage.java b/src/main/java/edu/harvard/iq/dataverse/mydata/MyDataPage.java index 2567f8b2774..3ae64d9d760 100644 --- a/src/main/java/edu/harvard/iq/dataverse/mydata/MyDataPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/mydata/MyDataPage.java @@ -18,12 +18,12 @@ import java.util.Arrays; import java.util.List; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.faces.context.FacesContext; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; -import javax.servlet.http.HttpServletRequest; +import jakarta.ejb.EJB; +import jakarta.faces.context.FacesContext; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.servlet.http.HttpServletRequest; /* * To change this license header, choose License Headers in Project Properties. diff --git a/src/main/java/edu/harvard/iq/dataverse/mydata/Pager.java b/src/main/java/edu/harvard/iq/dataverse/mydata/Pager.java index 4bf13e04284..096974b9d72 100644 --- a/src/main/java/edu/harvard/iq/dataverse/mydata/Pager.java +++ b/src/main/java/edu/harvard/iq/dataverse/mydata/Pager.java @@ -15,9 +15,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObjectBuilder; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObjectBuilder; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/mydata/RolePermissionHelperPage.java b/src/main/java/edu/harvard/iq/dataverse/mydata/RolePermissionHelperPage.java index 4c596d1bb84..dcb76f42acb 100644 --- a/src/main/java/edu/harvard/iq/dataverse/mydata/RolePermissionHelperPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/mydata/RolePermissionHelperPage.java @@ -3,16 +3,15 @@ import edu.harvard.iq.dataverse.DatasetPage; import edu.harvard.iq.dataverse.DataverseRoleServiceBean; import edu.harvard.iq.dataverse.DataverseSession; -import edu.harvard.iq.dataverse.DvObject; import edu.harvard.iq.dataverse.RoleAssigneeServiceBean; import edu.harvard.iq.dataverse.authorization.DataverseRole; import edu.harvard.iq.dataverse.authorization.DataverseRolePermissionHelper; import java.util.List; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.ejb.EJB; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; /* * To change this license header, choose License Headers in Project Properties. diff --git a/src/main/java/edu/harvard/iq/dataverse/mydata/RoleTagRetriever.java b/src/main/java/edu/harvard/iq/dataverse/mydata/RoleTagRetriever.java index cf7380a9a9b..e328a50e962 100644 --- a/src/main/java/edu/harvard/iq/dataverse/mydata/RoleTagRetriever.java +++ b/src/main/java/edu/harvard/iq/dataverse/mydata/RoleTagRetriever.java @@ -23,9 +23,8 @@ import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import org.apache.commons.lang3.StringUtils; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; /** * Input: dvObject id, parent Id, and dvObject type (from Solr) diff --git a/src/main/java/edu/harvard/iq/dataverse/passwordreset/PasswordResetData.java b/src/main/java/edu/harvard/iq/dataverse/passwordreset/PasswordResetData.java index a3150161c52..c078860ad8e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/passwordreset/PasswordResetData.java +++ b/src/main/java/edu/harvard/iq/dataverse/passwordreset/PasswordResetData.java @@ -6,19 +6,19 @@ import java.sql.Timestamp; import java.util.Date; import java.util.UUID; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.OneToOne; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; @Table(indexes = {@Index(columnList="token") , @Index(columnList="builtinuser_id")}) diff --git a/src/main/java/edu/harvard/iq/dataverse/passwordreset/PasswordResetPage.java b/src/main/java/edu/harvard/iq/dataverse/passwordreset/PasswordResetPage.java index b9eabf45159..b19721d56bb 100644 --- a/src/main/java/edu/harvard/iq/dataverse/passwordreset/PasswordResetPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/passwordreset/PasswordResetPage.java @@ -16,19 +16,19 @@ import edu.harvard.iq.dataverse.util.SystemConfig; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.faces.application.FacesMessage; -import javax.faces.context.FacesContext; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.ejb.EJB; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.context.FacesContext; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; import edu.harvard.iq.dataverse.validation.PasswordValidatorServiceBean; import java.util.Arrays; import java.util.Date; import java.util.List; -import javax.faces.component.UIComponent; -import javax.faces.component.UIInput; +import jakarta.faces.component.UIComponent; +import jakarta.faces.component.UIInput; import org.apache.commons.lang3.StringUtils; import org.hibernate.validator.constraints.NotBlank; diff --git a/src/main/java/edu/harvard/iq/dataverse/passwordreset/PasswordResetServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/passwordreset/PasswordResetServiceBean.java index c8db23985d8..5d1c167d2a5 100644 --- a/src/main/java/edu/harvard/iq/dataverse/passwordreset/PasswordResetServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/passwordreset/PasswordResetServiceBean.java @@ -10,18 +10,17 @@ import edu.harvard.iq.dataverse.util.SystemConfig; import java.text.MessageFormat; -import java.util.Date; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.NonUniqueResultException; -import javax.persistence.PersistenceContext; -import javax.persistence.TypedQuery; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.NoResultException; +import jakarta.persistence.NonUniqueResultException; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.TypedQuery; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; @Stateless diff --git a/src/main/java/edu/harvard/iq/dataverse/pidproviders/FakePidProviderServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/pidproviders/FakePidProviderServiceBean.java index 68dd853d4de..8a9768a884e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/pidproviders/FakePidProviderServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/pidproviders/FakePidProviderServiceBean.java @@ -3,13 +3,13 @@ import edu.harvard.iq.dataverse.DOIServiceBean; import edu.harvard.iq.dataverse.DvObject; import edu.harvard.iq.dataverse.GlobalId; -import java.util.ArrayList; + import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Logger; -import javax.ejb.Stateless; +import jakarta.ejb.Stateless; @Stateless public class FakePidProviderServiceBean extends DOIServiceBean { diff --git a/src/main/java/edu/harvard/iq/dataverse/pidproviders/PermaLinkPidProviderServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/pidproviders/PermaLinkPidProviderServiceBean.java index 957522b7728..95ace90b428 100644 --- a/src/main/java/edu/harvard/iq/dataverse/pidproviders/PermaLinkPidProviderServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/pidproviders/PermaLinkPidProviderServiceBean.java @@ -4,21 +4,17 @@ import edu.harvard.iq.dataverse.DvObject; import edu.harvard.iq.dataverse.GlobalId; import edu.harvard.iq.dataverse.GlobalIdServiceBean; -import edu.harvard.iq.dataverse.engine.command.impl.CreateNewDatasetCommand; import edu.harvard.iq.dataverse.settings.JvmSettings; import edu.harvard.iq.dataverse.settings.SettingsServiceBean.Key; import edu.harvard.iq.dataverse.util.SystemConfig; -import java.lang.StackWalker.StackFrame; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Logger; -import java.util.stream.Stream; -import javax.annotation.PostConstruct; -import javax.ejb.Stateless; +import jakarta.annotation.PostConstruct; +import jakarta.ejb.Stateless; /** * PermaLink provider diff --git a/src/main/java/edu/harvard/iq/dataverse/pidproviders/PidHelper.java b/src/main/java/edu/harvard/iq/dataverse/pidproviders/PidHelper.java index 478f5d6c2c4..5bc855a9593 100644 --- a/src/main/java/edu/harvard/iq/dataverse/pidproviders/PidHelper.java +++ b/src/main/java/edu/harvard/iq/dataverse/pidproviders/PidHelper.java @@ -1,10 +1,10 @@ package edu.harvard.iq.dataverse.pidproviders; import java.util.Arrays; -import javax.annotation.PostConstruct; -import javax.ejb.EJB; -import javax.ejb.Singleton; -import javax.ejb.Startup; +import jakarta.annotation.PostConstruct; +import jakarta.ejb.EJB; +import jakarta.ejb.Singleton; +import jakarta.ejb.Startup; import edu.harvard.iq.dataverse.DOIDataCiteServiceBean; import edu.harvard.iq.dataverse.DOIEZIdServiceBean; diff --git a/src/main/java/edu/harvard/iq/dataverse/pidproviders/PidUtil.java b/src/main/java/edu/harvard/iq/dataverse/pidproviders/PidUtil.java index 4db7d099a47..78305648f67 100644 --- a/src/main/java/edu/harvard/iq/dataverse/pidproviders/PidUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/pidproviders/PidUtil.java @@ -16,13 +16,13 @@ import java.util.Map; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.ws.rs.BadRequestException; -import javax.ws.rs.InternalServerErrorException; -import javax.ws.rs.NotFoundException; -import javax.ws.rs.ServiceUnavailableException; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.ws.rs.BadRequestException; +import jakarta.ws.rs.InternalServerErrorException; +import jakarta.ws.rs.NotFoundException; +import jakarta.ws.rs.ServiceUnavailableException; public class PidUtil { diff --git a/src/main/java/edu/harvard/iq/dataverse/pidproviders/UnmanagedDOIServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/pidproviders/UnmanagedDOIServiceBean.java index 088992fd3ec..d6df57accff 100644 --- a/src/main/java/edu/harvard/iq/dataverse/pidproviders/UnmanagedDOIServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/pidproviders/UnmanagedDOIServiceBean.java @@ -1,13 +1,12 @@ package edu.harvard.iq.dataverse.pidproviders; import java.io.IOException; -import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.logging.Logger; -import javax.annotation.PostConstruct; -import javax.ejb.Stateless; +import jakarta.annotation.PostConstruct; +import jakarta.ejb.Stateless; import org.apache.commons.httpclient.HttpException; import org.apache.commons.lang3.NotImplementedException; diff --git a/src/main/java/edu/harvard/iq/dataverse/pidproviders/UnmanagedHandlenetServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/pidproviders/UnmanagedHandlenetServiceBean.java index c467b8672ee..adbfa5dadaf 100644 --- a/src/main/java/edu/harvard/iq/dataverse/pidproviders/UnmanagedHandlenetServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/pidproviders/UnmanagedHandlenetServiceBean.java @@ -7,7 +7,7 @@ import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.Stateless; +import jakarta.ejb.Stateless; import org.apache.commons.lang3.NotImplementedException; /** This class is just used to parse Handles that are not managed by any account configured in Dataverse diff --git a/src/main/java/edu/harvard/iq/dataverse/privateurl/PrivateUrlPage.java b/src/main/java/edu/harvard/iq/dataverse/privateurl/PrivateUrlPage.java index b0658f10b34..9af4bb6af9e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/privateurl/PrivateUrlPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/privateurl/PrivateUrlPage.java @@ -4,10 +4,10 @@ import edu.harvard.iq.dataverse.authorization.users.PrivateUrlUser; import java.io.Serializable; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.ejb.EJB; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; /** * Backing bean for JSF page. Sets session to {@link PrivateUrlUser}. diff --git a/src/main/java/edu/harvard/iq/dataverse/privateurl/PrivateUrlServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/privateurl/PrivateUrlServiceBean.java index 8eb0dfe4ebd..9e5879106e4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/privateurl/PrivateUrlServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/privateurl/PrivateUrlServiceBean.java @@ -8,14 +8,14 @@ import edu.harvard.iq.dataverse.util.SystemConfig; import java.io.Serializable; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.NonUniqueResultException; -import javax.persistence.PersistenceContext; -import javax.persistence.TypedQuery; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.persistence.EntityManager; +import jakarta.persistence.NoResultException; +import jakarta.persistence.NonUniqueResultException; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.TypedQuery; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/provenance/ProvEntityFileDataConverter.java b/src/main/java/edu/harvard/iq/dataverse/provenance/ProvEntityFileDataConverter.java index 65b97b80eea..ba5aba1b69b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/provenance/ProvEntityFileDataConverter.java +++ b/src/main/java/edu/harvard/iq/dataverse/provenance/ProvEntityFileDataConverter.java @@ -1,11 +1,11 @@ package edu.harvard.iq.dataverse.provenance; -import javax.enterprise.inject.spi.CDI; -import javax.faces.component.UIComponent; -import javax.faces.context.FacesContext; -import javax.faces.convert.Converter; -import javax.faces.convert.FacesConverter; -import javax.inject.Inject; +import jakarta.enterprise.inject.spi.CDI; +import jakarta.faces.component.UIComponent; +import jakarta.faces.context.FacesContext; +import jakarta.faces.convert.Converter; +import jakarta.faces.convert.FacesConverter; +import jakarta.inject.Inject; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/provenance/ProvInvestigator.java b/src/main/java/edu/harvard/iq/dataverse/provenance/ProvInvestigator.java index a17e77f2a9e..c2eecb90d9e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/provenance/ProvInvestigator.java +++ b/src/main/java/edu/harvard/iq/dataverse/provenance/ProvInvestigator.java @@ -5,12 +5,12 @@ import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import com.google.gson.JsonParser; -import edu.harvard.iq.dataverse.api.AbstractApiBean; + import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.logging.Logger; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.everit.json.schema.Schema; import org.everit.json.schema.ValidationException; import org.everit.json.schema.loader.SchemaLoader; diff --git a/src/main/java/edu/harvard/iq/dataverse/provenance/ProvPopupFragmentBean.java b/src/main/java/edu/harvard/iq/dataverse/provenance/ProvPopupFragmentBean.java index a4b7cdf8d4e..6e8a512902a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/provenance/ProvPopupFragmentBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/provenance/ProvPopupFragmentBean.java @@ -24,19 +24,19 @@ import java.util.HashMap; import java.util.Map; import java.util.logging.Level; -import javax.ejb.EJB; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.ejb.EJB; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; import org.apache.commons.io.IOUtils; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; -import javax.faces.application.FacesMessage; -import javax.faces.context.ExternalContext; -import javax.faces.context.FacesContext; -import javax.json.JsonObject; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.context.ExternalContext; +import jakarta.faces.context.FacesContext; +import jakarta.json.JsonObject; import org.primefaces.model.file.UploadedFile; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/repositorystorageabstractionlayer/RepositoryStorageAbstractionLayerPage.java b/src/main/java/edu/harvard/iq/dataverse/repositorystorageabstractionlayer/RepositoryStorageAbstractionLayerPage.java index 4d89a2842cd..c252d2e3330 100644 --- a/src/main/java/edu/harvard/iq/dataverse/repositorystorageabstractionlayer/RepositoryStorageAbstractionLayerPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/repositorystorageabstractionlayer/RepositoryStorageAbstractionLayerPage.java @@ -6,10 +6,10 @@ import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import java.util.List; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.json.JsonArray; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.json.JsonArray; @Stateless @Named diff --git a/src/main/java/edu/harvard/iq/dataverse/repositorystorageabstractionlayer/RepositoryStorageAbstractionLayerUtil.java b/src/main/java/edu/harvard/iq/dataverse/repositorystorageabstractionlayer/RepositoryStorageAbstractionLayerUtil.java index ee52254d6f5..8501fba3ce0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/repositorystorageabstractionlayer/RepositoryStorageAbstractionLayerUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/repositorystorageabstractionlayer/RepositoryStorageAbstractionLayerUtil.java @@ -3,15 +3,15 @@ import edu.harvard.iq.dataverse.Dataset; import edu.harvard.iq.dataverse.locality.StorageSite; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; -import edu.harvard.iq.dataverse.util.SystemConfig; + import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObject; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; public class RepositoryStorageAbstractionLayerUtil { diff --git a/src/main/java/edu/harvard/iq/dataverse/search/AdvancedSearchPage.java b/src/main/java/edu/harvard/iq/dataverse/search/AdvancedSearchPage.java index ef37569ac54..bc92959a5ac 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/AdvancedSearchPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/AdvancedSearchPage.java @@ -14,20 +14,16 @@ import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; -import java.util.StringTokenizer; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; -import javax.json.JsonObject; +import jakarta.ejb.EJB; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.json.JsonObject; import org.apache.commons.lang3.StringUtils; diff --git a/src/main/java/edu/harvard/iq/dataverse/search/FacetLabel.java b/src/main/java/edu/harvard/iq/dataverse/search/FacetLabel.java index f8bd0ea5a10..f97c1641479 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/FacetLabel.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/FacetLabel.java @@ -1,6 +1,6 @@ package edu.harvard.iq.dataverse.search; -import javax.inject.Named; +import jakarta.inject.Named; @Named public class FacetLabel implements Comparable{ diff --git a/src/main/java/edu/harvard/iq/dataverse/search/Highlight.java b/src/main/java/edu/harvard/iq/dataverse/search/Highlight.java index 98a882c13ca..d40d8c362af 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/Highlight.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/Highlight.java @@ -1,7 +1,7 @@ package edu.harvard.iq.dataverse.search; import java.util.List; -import javax.inject.Named; +import jakarta.inject.Named; @Named public class Highlight { diff --git a/src/main/java/edu/harvard/iq/dataverse/search/IndexAsync.java b/src/main/java/edu/harvard/iq/dataverse/search/IndexAsync.java index a04ae934259..c9cf1cd9dc7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/IndexAsync.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/IndexAsync.java @@ -5,9 +5,9 @@ import java.util.Collection; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.Asynchronous; -import javax.ejb.EJB; -import javax.ejb.Stateless; +import jakarta.ejb.Asynchronous; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; @Stateless public class IndexAsync { diff --git a/src/main/java/edu/harvard/iq/dataverse/search/IndexBatchServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/search/IndexBatchServiceBean.java index 932f58d875d..0eeb681514c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/IndexBatchServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/IndexBatchServiceBean.java @@ -1,30 +1,27 @@ package edu.harvard.iq.dataverse.search; -import edu.harvard.iq.dataverse.Dataset; import edu.harvard.iq.dataverse.DatasetServiceBean; import edu.harvard.iq.dataverse.Dataverse; import edu.harvard.iq.dataverse.DataverseServiceBean; import edu.harvard.iq.dataverse.DvObjectServiceBean; import edu.harvard.iq.dataverse.util.SystemConfig; import java.io.IOException; -import java.sql.Timestamp; import java.util.ArrayList; -import java.util.Date; import java.util.List; import java.util.concurrent.Future; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.AsyncResult; -import javax.ejb.Asynchronous; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; +import jakarta.ejb.AsyncResult; +import jakarta.ejb.Asynchronous; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import org.apache.solr.client.solrj.SolrServerException; @Named diff --git a/src/main/java/edu/harvard/iq/dataverse/search/IndexServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/search/IndexServiceBean.java index 0b8f93e47a9..d96593dae9c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/IndexServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/IndexServiceBean.java @@ -41,7 +41,6 @@ import java.io.IOException; import java.io.InputStream; import java.sql.Timestamp; -import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.util.ArrayList; @@ -54,26 +53,25 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Optional; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Future; import java.util.function.Function; import java.util.logging.Logger; import java.util.stream.Collectors; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; -import javax.ejb.AsyncResult; -import javax.ejb.Asynchronous; -import javax.ejb.EJB; -import javax.ejb.EJBException; -import javax.ejb.Stateless; -import javax.ejb.TransactionAttribute; -import static javax.ejb.TransactionAttributeType.REQUIRES_NEW; -import javax.inject.Named; -import javax.json.JsonObject; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; +import jakarta.ejb.AsyncResult; +import jakarta.ejb.Asynchronous; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBException; +import jakarta.ejb.Stateless; +import jakarta.ejb.TransactionAttribute; +import static jakarta.ejb.TransactionAttributeType.REQUIRES_NEW; +import jakarta.inject.Named; +import jakarta.json.JsonObject; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; diff --git a/src/main/java/edu/harvard/iq/dataverse/search/SearchFilesServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/search/SearchFilesServiceBean.java index 2bf8807e301..8caee7d16b4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/SearchFilesServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/SearchFilesServiceBean.java @@ -7,11 +7,11 @@ import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.faces.context.FacesContext; -import javax.inject.Named; -import javax.servlet.http.HttpServletRequest; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.faces.context.FacesContext; +import jakarta.inject.Named; +import jakarta.servlet.http.HttpServletRequest; @Named @Stateless diff --git a/src/main/java/edu/harvard/iq/dataverse/search/SearchIncludeFragment.java b/src/main/java/edu/harvard/iq/dataverse/search/SearchIncludeFragment.java index bfe397cf48c..e249b81c983 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/SearchIncludeFragment.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/SearchIncludeFragment.java @@ -8,8 +8,6 @@ import edu.harvard.iq.dataverse.DatasetFieldType; import edu.harvard.iq.dataverse.DatasetFieldType.FieldType; import edu.harvard.iq.dataverse.DatasetServiceBean; -import edu.harvard.iq.dataverse.DatasetVersion; -import edu.harvard.iq.dataverse.DatasetVersion.VersionState; import edu.harvard.iq.dataverse.DatasetVersionServiceBean; import edu.harvard.iq.dataverse.Dataverse; import edu.harvard.iq.dataverse.DataverseFacet; @@ -37,12 +35,12 @@ import java.util.Optional; import java.util.Set; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.enterprise.context.RequestScoped; -import javax.faces.context.FacesContext; -import javax.inject.Inject; -import javax.inject.Named; -import javax.servlet.http.HttpServletRequest; +import jakarta.ejb.EJB; +import jakarta.enterprise.context.RequestScoped; +import jakarta.faces.context.FacesContext; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; diff --git a/src/main/java/edu/harvard/iq/dataverse/search/SearchPermissionsServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/search/SearchPermissionsServiceBean.java index e96164d442d..0dd2153f75b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/SearchPermissionsServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/SearchPermissionsServiceBean.java @@ -22,9 +22,9 @@ import java.util.Map; import java.util.Set; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Named; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; /** * Determine whether items should be searchable. diff --git a/src/main/java/edu/harvard/iq/dataverse/search/SearchServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/search/SearchServiceBean.java index 9ac4b2406e8..5df8c58ff35 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/SearchServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/SearchServiceBean.java @@ -20,7 +20,6 @@ import edu.harvard.iq.dataverse.util.SystemConfig; import java.io.IOException; import java.lang.reflect.Field; -import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; @@ -36,12 +35,12 @@ import java.util.MissingResourceException; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.EJBTransactionRolledbackException; -import javax.ejb.Stateless; -import javax.ejb.TransactionRolledbackLocalException; -import javax.inject.Named; -import javax.persistence.NoResultException; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBTransactionRolledbackException; +import jakarta.ejb.Stateless; +import jakarta.ejb.TransactionRolledbackLocalException; +import jakarta.inject.Named; +import jakarta.persistence.NoResultException; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrQuery.SortClause; import org.apache.solr.client.solrj.SolrServerException; diff --git a/src/main/java/edu/harvard/iq/dataverse/search/SolrClientService.java b/src/main/java/edu/harvard/iq/dataverse/search/SolrClientService.java index 0dc2fe08b54..b36130de7c8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/SolrClientService.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/SolrClientService.java @@ -10,11 +10,11 @@ import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.impl.HttpSolrClient; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; -import javax.ejb.EJB; -import javax.ejb.Singleton; -import javax.inject.Named; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; +import jakarta.ejb.EJB; +import jakarta.ejb.Singleton; +import jakarta.inject.Named; import java.io.IOException; import java.util.logging.Logger; diff --git a/src/main/java/edu/harvard/iq/dataverse/search/SolrIndexServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/search/SolrIndexServiceBean.java index 5856004ce53..04021eb75b6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/SolrIndexServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/SolrIndexServiceBean.java @@ -20,11 +20,11 @@ import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.json.Json; -import javax.json.JsonObjectBuilder; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.response.UpdateResponse; import org.apache.solr.common.SolrInputDocument; diff --git a/src/main/java/edu/harvard/iq/dataverse/search/SolrQueryResponse.java b/src/main/java/edu/harvard/iq/dataverse/search/SolrQueryResponse.java index b499b80961e..893099ff08d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/SolrQueryResponse.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/SolrQueryResponse.java @@ -5,8 +5,8 @@ import java.util.List; import java.util.Map; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonObjectBuilder; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.response.FacetField; diff --git a/src/main/java/edu/harvard/iq/dataverse/search/SolrSearchResult.java b/src/main/java/edu/harvard/iq/dataverse/search/SolrSearchResult.java index b58c22b64c9..6ad7f9dbbf6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/SolrSearchResult.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/SolrSearchResult.java @@ -9,10 +9,10 @@ import java.util.Map; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; import org.apache.commons.collections4.CollectionUtils; diff --git a/src/main/java/edu/harvard/iq/dataverse/search/savedsearch/SavedSearch.java b/src/main/java/edu/harvard/iq/dataverse/search/savedsearch/SavedSearch.java index 66bb63ed596..ff4a2e4aa96 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/savedsearch/SavedSearch.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/savedsearch/SavedSearch.java @@ -5,16 +5,16 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.List; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.OneToMany; -import javax.persistence.Table; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; @Entity @Table(indexes = {@Index(columnList="definitionpoint_id") diff --git a/src/main/java/edu/harvard/iq/dataverse/search/savedsearch/SavedSearchFilterQuery.java b/src/main/java/edu/harvard/iq/dataverse/search/savedsearch/SavedSearchFilterQuery.java index f884a9529c9..7f51f9c8728 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/savedsearch/SavedSearchFilterQuery.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/savedsearch/SavedSearchFilterQuery.java @@ -1,16 +1,16 @@ package edu.harvard.iq.dataverse.search.savedsearch; import java.io.Serializable; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; @Entity @Table(indexes = {@Index(columnList="savedsearch_id")}) diff --git a/src/main/java/edu/harvard/iq/dataverse/search/savedsearch/SavedSearchServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/search/savedsearch/SavedSearchServiceBean.java index 587e054dc4a..7fc2bdf79a3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/savedsearch/SavedSearchServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/savedsearch/SavedSearchServiceBean.java @@ -21,24 +21,23 @@ import edu.harvard.iq.dataverse.search.SortBy; import edu.harvard.iq.dataverse.util.SystemConfig; import java.util.ArrayList; -import java.util.Collections; import java.util.Date; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ejb.Schedule; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObjectBuilder; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.NonUniqueResultException; -import javax.persistence.PersistenceContext; -import javax.persistence.TypedQuery; -import javax.servlet.http.HttpServletRequest; +import jakarta.ejb.EJB; +import jakarta.ejb.Schedule; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObjectBuilder; +import jakarta.persistence.EntityManager; +import jakarta.persistence.NoResultException; +import jakarta.persistence.NonUniqueResultException; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.TypedQuery; +import jakarta.servlet.http.HttpServletRequest; @Stateless @Named diff --git a/src/main/java/edu/harvard/iq/dataverse/settings/Setting.java b/src/main/java/edu/harvard/iq/dataverse/settings/Setting.java index 160ed693eee..b1910a2fbb5 100644 --- a/src/main/java/edu/harvard/iq/dataverse/settings/Setting.java +++ b/src/main/java/edu/harvard/iq/dataverse/settings/Setting.java @@ -2,13 +2,13 @@ import java.io.Serializable; import java.util.Objects; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; /** * A single value in the config of dataverse. diff --git a/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java index d1ed3191556..4a94e42085a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java @@ -5,16 +5,16 @@ import edu.harvard.iq.dataverse.api.ApiBlockingFilter; import edu.harvard.iq.dataverse.util.StringUtil; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonObject; -import javax.json.JsonReader; -import javax.json.JsonValue; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; +import jakarta.json.JsonValue; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import org.json.JSONArray; import org.json.JSONException; diff --git a/src/main/java/edu/harvard/iq/dataverse/sitemap/SiteMapServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/sitemap/SiteMapServiceBean.java index 14db98e540e..a51acd1f54f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/sitemap/SiteMapServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/sitemap/SiteMapServiceBean.java @@ -3,8 +3,8 @@ import edu.harvard.iq.dataverse.Dataset; import edu.harvard.iq.dataverse.Dataverse; import java.util.List; -import javax.ejb.Asynchronous; -import javax.ejb.Stateless; +import jakarta.ejb.Asynchronous; +import jakarta.ejb.Stateless; @Stateless public class SiteMapServiceBean { diff --git a/src/main/java/edu/harvard/iq/dataverse/timer/DataverseTimerServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/timer/DataverseTimerServiceBean.java index b132bff9429..6eb3a8df0bc 100644 --- a/src/main/java/edu/harvard/iq/dataverse/timer/DataverseTimerServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/timer/DataverseTimerServiceBean.java @@ -25,17 +25,17 @@ import java.util.Iterator; import java.util.logging.Level; import java.util.logging.Logger; -import javax.annotation.PostConstruct; -import javax.annotation.Resource; -import javax.ejb.EJB; -import javax.ejb.Singleton; -import javax.ejb.Startup; -import javax.ejb.Timeout; -import javax.ejb.Timer; -import javax.ejb.TimerConfig; -import javax.ejb.TransactionAttribute; -import javax.ejb.TransactionAttributeType; -import javax.servlet.http.HttpServletRequest; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import jakarta.ejb.EJB; +import jakarta.ejb.Singleton; +import jakarta.ejb.Startup; +import jakarta.ejb.Timeout; +import jakarta.ejb.Timer; +import jakarta.ejb.TimerConfig; +import jakarta.ejb.TransactionAttribute; +import jakarta.ejb.TransactionAttributeType; +import jakarta.servlet.http.HttpServletRequest; /** @@ -55,7 +55,7 @@ public class DataverseTimerServiceBean implements Serializable { private static final Logger logger = Logger.getLogger("edu.harvard.iq.dataverse.timer.DataverseTimerServiceBean"); @Resource - javax.ejb.TimerService timerService; + jakarta.ejb.TimerService timerService; @EJB HarvesterServiceBean harvesterService; @EJB @@ -109,7 +109,7 @@ public void createTimer(Date initialExpiration, long intervalDuration, Serializa */ @Timeout @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) - public void handleTimeout(javax.ejb.Timer timer) { + public void handleTimeout(jakarta.ejb.Timer timer) { // We have to put all the code in a try/catch block because // if an exception is thrown from this method, Glassfish will automatically // call the method a second time. (The minimum number of re-tries for a Timer method is 1) diff --git a/src/main/java/edu/harvard/iq/dataverse/userdata/UserListResult.java b/src/main/java/edu/harvard/iq/dataverse/userdata/UserListResult.java index 07937638607..5e7f532d2ac 100644 --- a/src/main/java/edu/harvard/iq/dataverse/userdata/UserListResult.java +++ b/src/main/java/edu/harvard/iq/dataverse/userdata/UserListResult.java @@ -7,14 +7,13 @@ import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.mydata.Pager; -import edu.harvard.iq.dataverse.util.BundleUtil; + import java.util.ArrayList; import java.util.List; -import java.util.logging.Level; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObjectBuilder; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObjectBuilder; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/util/BundleUtil.java b/src/main/java/edu/harvard/iq/dataverse/util/BundleUtil.java index 26694c0ac6c..922e6ff5d28 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/BundleUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/BundleUtil.java @@ -12,7 +12,7 @@ import java.util.logging.Logger; import java.util.Map; import java.util.HashMap; -import javax.faces.context.FacesContext; +import jakarta.faces.context.FacesContext; public class BundleUtil { diff --git a/src/main/java/edu/harvard/iq/dataverse/util/ClockUtil.java b/src/main/java/edu/harvard/iq/dataverse/util/ClockUtil.java index 9c1c89430d5..d51f70229a9 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/ClockUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/ClockUtil.java @@ -1,8 +1,8 @@ package edu.harvard.iq.dataverse.util; -import javax.enterprise.inject.Produces; -import javax.inject.Qualifier; -import javax.inject.Singleton; +import jakarta.enterprise.inject.Produces; +import jakarta.inject.Qualifier; +import jakarta.inject.Singleton; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/src/main/java/edu/harvard/iq/dataverse/util/ConstraintViolationUtil.java b/src/main/java/edu/harvard/iq/dataverse/util/ConstraintViolationUtil.java index d2e59fac9f5..1910fde6489 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/ConstraintViolationUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/ConstraintViolationUtil.java @@ -5,8 +5,8 @@ */ package edu.harvard.iq.dataverse.util; -import javax.validation.ConstraintViolation; -import javax.validation.ConstraintViolationException; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/util/DataSourceProducer.java b/src/main/java/edu/harvard/iq/dataverse/util/DataSourceProducer.java index 800c05ae6dc..c6994397a9c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/DataSourceProducer.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/DataSourceProducer.java @@ -1,9 +1,9 @@ package edu.harvard.iq.dataverse.util; -import javax.annotation.Resource; -import javax.annotation.sql.DataSourceDefinition; -import javax.enterprise.inject.Produces; -import javax.inject.Singleton; +import jakarta.annotation.Resource; +import jakarta.annotation.sql.DataSourceDefinition; +import jakarta.enterprise.inject.Produces; +import jakarta.inject.Singleton; import javax.sql.DataSource; // Find docs here: https://javaee.github.io/javaee-spec/javadocs/javax/annotation/sql/DataSourceDefinition.html diff --git a/src/main/java/edu/harvard/iq/dataverse/util/DatasetFieldWalker.java b/src/main/java/edu/harvard/iq/dataverse/util/DatasetFieldWalker.java index df97998d9e8..25032860d11 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/DatasetFieldWalker.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/DatasetFieldWalker.java @@ -3,7 +3,6 @@ import edu.harvard.iq.dataverse.ControlledVocabularyValue; import edu.harvard.iq.dataverse.DatasetField; import edu.harvard.iq.dataverse.DatasetFieldCompoundValue; -import edu.harvard.iq.dataverse.DatasetFieldServiceBean; import edu.harvard.iq.dataverse.DatasetFieldType; import edu.harvard.iq.dataverse.DatasetFieldValue; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; @@ -12,12 +11,10 @@ import java.util.Comparator; import java.util.List; import java.util.Map; -import java.util.SortedSet; -import java.util.TreeSet; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonObject; +import jakarta.json.Json; +import jakarta.json.JsonObject; /** * A means of iterating over {@link DatasetField}s, or a collection of them. diff --git a/src/main/java/edu/harvard/iq/dataverse/util/EjbUtil.java b/src/main/java/edu/harvard/iq/dataverse/util/EjbUtil.java index cf337b0a020..fd8c8fa4a9c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/EjbUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/EjbUtil.java @@ -1,6 +1,6 @@ package edu.harvard.iq.dataverse.util; -import javax.ejb.EJBException; +import jakarta.ejb.EJBException; public class EjbUtil { diff --git a/src/main/java/edu/harvard/iq/dataverse/util/FileUtil.java b/src/main/java/edu/harvard/iq/dataverse/util/FileUtil.java index 6bb7e1d583b..fdb03508c75 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/FileUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/FileUtil.java @@ -64,8 +64,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.nio.channels.FileChannel; -import java.nio.channels.WritableByteChannel; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; @@ -87,11 +85,11 @@ import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; -import javax.activation.MimetypesFileTypeMap; -import javax.ejb.EJBException; -import javax.enterprise.inject.spi.CDI; -import javax.json.JsonArray; -import javax.json.JsonObject; +import jakarta.activation.MimetypesFileTypeMap; +import jakarta.ejb.EJBException; +import jakarta.enterprise.inject.spi.CDI; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; diff --git a/src/main/java/edu/harvard/iq/dataverse/util/JsfHelper.java b/src/main/java/edu/harvard/iq/dataverse/util/JsfHelper.java index 5b87b18573b..b02ac63cacd 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/JsfHelper.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/JsfHelper.java @@ -1,11 +1,9 @@ package edu.harvard.iq.dataverse.util; -import java.util.Locale; -import java.util.ResourceBundle; import java.util.logging.Level; import java.util.logging.Logger; -import javax.faces.application.FacesMessage; -import javax.faces.context.FacesContext; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.context.FacesContext; /** * Utility class for common JSF tasks. diff --git a/src/main/java/edu/harvard/iq/dataverse/util/MailUtil.java b/src/main/java/edu/harvard/iq/dataverse/util/MailUtil.java index 72980c3451a..dcb6e078df6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/MailUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/MailUtil.java @@ -8,8 +8,8 @@ import java.util.Arrays; import java.util.List; import java.util.logging.Logger; -import javax.mail.internet.AddressException; -import javax.mail.internet.InternetAddress; +import jakarta.mail.internet.AddressException; +import jakarta.mail.internet.InternetAddress; public class MailUtil { diff --git a/src/main/java/edu/harvard/iq/dataverse/util/PersonOrOrgUtil.java b/src/main/java/edu/harvard/iq/dataverse/util/PersonOrOrgUtil.java index 60f5c91efc4..96ef9ae68fa 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/PersonOrOrgUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/PersonOrOrgUtil.java @@ -4,10 +4,10 @@ import java.util.List; import java.util.logging.Logger; -import javax.json.JsonArray; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.JsonString; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonString; import edu.harvard.iq.dataverse.util.json.JsonUtil; import edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder; diff --git a/src/main/java/edu/harvard/iq/dataverse/util/RequiredCheckboxValidator.java b/src/main/java/edu/harvard/iq/dataverse/util/RequiredCheckboxValidator.java index 0221d45e4b0..fdac50ee58a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/RequiredCheckboxValidator.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/RequiredCheckboxValidator.java @@ -1,12 +1,12 @@ package edu.harvard.iq.dataverse.util; import java.text.MessageFormat; -import javax.faces.application.FacesMessage; -import javax.faces.component.UIComponent; -import javax.faces.component.UIInput; -import javax.faces.context.FacesContext; -import javax.faces.validator.Validator; -import javax.faces.validator.ValidatorException; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.component.UIComponent; +import jakarta.faces.component.UIInput; +import jakarta.faces.context.FacesContext; +import jakarta.faces.validator.Validator; +import jakarta.faces.validator.ValidatorException; /** * from http://balusc.blogspot.com/2008/09/validate-required-checkbox.html via diff --git a/src/main/java/edu/harvard/iq/dataverse/util/SessionUtil.java b/src/main/java/edu/harvard/iq/dataverse/util/SessionUtil.java index 0539ea40cb8..effa1980d70 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/SessionUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/SessionUtil.java @@ -4,8 +4,8 @@ import java.util.HashMap; import java.util.Map.Entry; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; public class SessionUtil { diff --git a/src/main/java/edu/harvard/iq/dataverse/util/SignpostingResources.java b/src/main/java/edu/harvard/iq/dataverse/util/SignpostingResources.java index 54be3a8765f..2c9b7167059 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/SignpostingResources.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/SignpostingResources.java @@ -16,9 +16,9 @@ Two configurable options allow changing the limit for the number of authors or d import edu.harvard.iq.dataverse.*; import edu.harvard.iq.dataverse.dataset.DatasetUtil; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObjectBuilder; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObjectBuilder; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; diff --git a/src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java b/src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java index 45f7f396783..248bfc0026e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java @@ -13,15 +13,15 @@ import edu.harvard.iq.dataverse.validation.PasswordValidatorUtil; import org.passay.CharacterRule; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonObject; -import javax.json.JsonReader; -import javax.json.JsonString; -import javax.json.JsonValue; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; import java.io.StringReader; import java.net.InetAddress; import java.net.UnknownHostException; diff --git a/src/main/java/edu/harvard/iq/dataverse/util/URLTokenUtil.java b/src/main/java/edu/harvard/iq/dataverse/util/URLTokenUtil.java index 4acf2d544e8..4ae76a7b8db 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/URLTokenUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/URLTokenUtil.java @@ -5,8 +5,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.json.Json; -import javax.json.JsonValue; +import jakarta.json.Json; +import jakarta.json.JsonValue; import edu.harvard.iq.dataverse.DataFile; import edu.harvard.iq.dataverse.Dataset; diff --git a/src/main/java/edu/harvard/iq/dataverse/util/WebloaderUtil.java b/src/main/java/edu/harvard/iq/dataverse/util/WebloaderUtil.java index c2d9bf67236..acbdc6aa3c6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/WebloaderUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/WebloaderUtil.java @@ -1,22 +1,12 @@ package edu.harvard.iq.dataverse.util; -import java.util.Date; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map.Entry; import java.util.logging.Logger; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; import edu.harvard.iq.dataverse.Dataset; -import edu.harvard.iq.dataverse.DatasetPage; -import edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean; import edu.harvard.iq.dataverse.authorization.users.ApiToken; -import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; -import edu.harvard.iq.dataverse.authorization.users.User; -import edu.harvard.iq.dataverse.settings.SettingsServiceBean; public class WebloaderUtil { diff --git a/src/main/java/edu/harvard/iq/dataverse/util/bagit/BagGenerator.java b/src/main/java/edu/harvard/iq/dataverse/util/bagit/BagGenerator.java index 8061b6e339e..baba1a0cb43 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/bagit/BagGenerator.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/bagit/BagGenerator.java @@ -110,7 +110,7 @@ public class BagGenerator { private String apiKey = null; - private javax.json.JsonObject oremapObject; + private jakarta.json.JsonObject oremapObject; private JsonObject aggregation; private String dataciteXml; diff --git a/src/main/java/edu/harvard/iq/dataverse/util/bagit/OREMap.java b/src/main/java/edu/harvard/iq/dataverse/util/bagit/OREMap.java index f8b8831e365..d32e33a8e29 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/bagit/OREMap.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/bagit/OREMap.java @@ -29,12 +29,12 @@ import java.util.logging.Level; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.JsonValue; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonValue; import org.apache.commons.lang3.exception.ExceptionUtils; diff --git a/src/main/java/edu/harvard/iq/dataverse/util/bagit/OREMapHelper.java b/src/main/java/edu/harvard/iq/dataverse/util/bagit/OREMapHelper.java index 6cd7f0928dc..4d63edac268 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/bagit/OREMapHelper.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/bagit/OREMapHelper.java @@ -3,10 +3,10 @@ import edu.harvard.iq.dataverse.DatasetFieldServiceBean; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; -import javax.annotation.PostConstruct; -import javax.ejb.EJB; -import javax.ejb.Singleton; -import javax.ejb.Startup; +import jakarta.annotation.PostConstruct; +import jakarta.ejb.EJB; +import jakarta.ejb.Singleton; +import jakarta.ejb.Startup; /** * This is a small helper bean diff --git a/src/main/java/edu/harvard/iq/dataverse/util/file/BagItFileHandlerFactory.java b/src/main/java/edu/harvard/iq/dataverse/util/file/BagItFileHandlerFactory.java index 53c80037223..4b0263030dc 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/file/BagItFileHandlerFactory.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/file/BagItFileHandlerFactory.java @@ -7,10 +7,10 @@ import edu.harvard.iq.dataverse.util.bagit.data.FileDataProviderFactory; import edu.harvard.iq.dataverse.util.bagit.data.FileUtilWrapper; -import javax.annotation.PostConstruct; -import javax.ejb.EJB; -import javax.enterprise.context.SessionScoped; -import javax.inject.Named; +import jakarta.annotation.PostConstruct; +import jakarta.ejb.EJB; +import jakarta.enterprise.context.SessionScoped; +import jakarta.inject.Named; import java.io.Serializable; import java.util.Optional; import java.util.logging.Logger; diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/BriefJsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/BriefJsonPrinter.java index ee0a882a10d..3fcaf6b11ff 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/BriefJsonPrinter.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/BriefJsonPrinter.java @@ -1,11 +1,10 @@ package edu.harvard.iq.dataverse.util.json; import edu.harvard.iq.dataverse.DatasetVersion; -import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinUser; import edu.harvard.iq.dataverse.MetadataBlock; import static edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder.jsonObjectBuilder; import edu.harvard.iq.dataverse.workflow.Workflow; -import javax.json.JsonObjectBuilder; +import jakarta.json.JsonObjectBuilder; /** * A Json printer that prints minimal data on objects. Useful when embedding diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JSONLDUtil.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JSONLDUtil.java index 9dc7fe6415b..363de5c1e3d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JSONLDUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JSONLDUtil.java @@ -18,17 +18,17 @@ import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.JsonString; -import javax.json.JsonValue; -import javax.json.JsonWriter; -import javax.json.JsonWriterFactory; -import javax.json.JsonValue.ValueType; -import javax.json.stream.JsonGenerator; -import javax.ws.rs.BadRequestException; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; +import jakarta.json.JsonWriter; +import jakarta.json.JsonWriterFactory; +import jakarta.json.JsonValue.ValueType; +import jakarta.json.stream.JsonGenerator; +import jakarta.ws.rs.BadRequestException; import edu.harvard.iq.dataverse.ControlledVocabularyValue; import edu.harvard.iq.dataverse.Dataset; diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonParser.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonParser.java index 59290449988..febb785cd95 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonParser.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonParser.java @@ -50,13 +50,13 @@ import java.util.Set; import java.util.logging.Logger; import java.util.stream.Collectors; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonObject; -import javax.json.JsonReader; -import javax.json.JsonString; -import javax.json.JsonValue; -import javax.json.JsonValue.ValueType; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; +import jakarta.json.JsonValue.ValueType; /** * Parses JSON objects into domain objects. diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java index 16c8a3ff471..dda8883f1a6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java @@ -17,7 +17,6 @@ import edu.harvard.iq.dataverse.DataverseContact; import edu.harvard.iq.dataverse.DataverseFacet; import edu.harvard.iq.dataverse.DataverseTheme; -import edu.harvard.iq.dataverse.api.Datasets; import edu.harvard.iq.dataverse.authorization.DataverseRole; import edu.harvard.iq.dataverse.authorization.groups.impl.maildomain.MailDomainGroup; import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinUser; @@ -55,12 +54,10 @@ import edu.harvard.iq.dataverse.workflow.step.WorkflowStepData; import java.util.*; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObjectBuilder; -import javax.json.JsonValue; - -import org.apache.commons.collections4.CollectionUtils; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonValue; import java.util.function.BiConsumer; import java.util.function.BinaryOperator; @@ -71,10 +68,10 @@ import java.util.stream.Collectors; import static java.util.stream.Collectors.toList; -import javax.ejb.EJB; -import javax.ejb.Singleton; -import javax.json.JsonArray; -import javax.json.JsonObject; +import jakarta.ejb.EJB; +import jakarta.ejb.Singleton; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; /** * Convert objects to Json. diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinterHelper.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinterHelper.java index 1c7dce24680..55f9ecb5ce8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinterHelper.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinterHelper.java @@ -3,10 +3,10 @@ import edu.harvard.iq.dataverse.DatasetFieldServiceBean; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; -import javax.annotation.PostConstruct; -import javax.ejb.EJB; -import javax.ejb.Singleton; -import javax.ejb.Startup; +import jakarta.annotation.PostConstruct; +import jakarta.ejb.EJB; +import jakarta.ejb.Singleton; +import jakarta.ejb.Startup; /** * This is a small helper bean diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonUtil.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonUtil.java index d02099eddb5..09d02854bab 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonUtil.java @@ -9,11 +9,11 @@ import java.util.HashMap; import java.util.Map; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonWriter; -import javax.json.JsonWriterFactory; -import javax.json.stream.JsonGenerator; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonWriter; +import jakarta.json.JsonWriterFactory; +import jakarta.json.stream.JsonGenerator; public class JsonUtil { @@ -47,7 +47,7 @@ public static String prettyPrint(JsonArray jsonArray) { return stringWriter.toString(); } - public static String prettyPrint(javax.json.JsonObject jsonObject) { + public static String prettyPrint(jakarta.json.JsonObject jsonObject) { Map config = new HashMap<>(); config.put(JsonGenerator.PRETTY_PRINTING, true); JsonWriterFactory jsonWriterFactory = Json.createWriterFactory(config); @@ -58,13 +58,13 @@ public static String prettyPrint(javax.json.JsonObject jsonObject) { return stringWriter.toString(); } - public static javax.json.JsonObject getJsonObject(String serializedJson) { + public static jakarta.json.JsonObject getJsonObject(String serializedJson) { try (StringReader rdr = new StringReader(serializedJson)) { return Json.createReader(rdr).readObject(); } } - public static javax.json.JsonArray getJsonArray(String serializedJson) { + public static jakarta.json.JsonArray getJsonArray(String serializedJson) { try (StringReader rdr = new StringReader(serializedJson)) { return Json.createReader(rdr).readArray(); } diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/NullSafeJsonBuilder.java b/src/main/java/edu/harvard/iq/dataverse/util/json/NullSafeJsonBuilder.java index 59a23a43452..ef8ab39122f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/NullSafeJsonBuilder.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/NullSafeJsonBuilder.java @@ -5,11 +5,11 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.sql.Timestamp; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.JsonValue; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonValue; /** * A JSON builder that drops any null values. If we didn't drop'em, diff --git a/src/main/java/edu/harvard/iq/dataverse/validation/EMailValidator.java b/src/main/java/edu/harvard/iq/dataverse/validation/EMailValidator.java index 5050aad5bf7..624e49623f2 100644 --- a/src/main/java/edu/harvard/iq/dataverse/validation/EMailValidator.java +++ b/src/main/java/edu/harvard/iq/dataverse/validation/EMailValidator.java @@ -1,7 +1,7 @@ package edu.harvard.iq.dataverse.validation; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; import org.apache.commons.validator.routines.EmailValidator; diff --git a/src/main/java/edu/harvard/iq/dataverse/validation/PasswordValidatorServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/validation/PasswordValidatorServiceBean.java index c32e6728358..41e7f1b8b22 100644 --- a/src/main/java/edu/harvard/iq/dataverse/validation/PasswordValidatorServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/validation/PasswordValidatorServiceBean.java @@ -18,9 +18,9 @@ import java.util.logging.Logger; import java.util.regex.Pattern; import java.util.stream.Collectors; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Named; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; import org.passay.CharacterCharacteristicsRule; import org.passay.CharacterRule; import org.passay.DictionaryRule; diff --git a/src/main/java/edu/harvard/iq/dataverse/validation/URLValidator.java b/src/main/java/edu/harvard/iq/dataverse/validation/URLValidator.java index 846ae48783a..285f34d3f8c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/validation/URLValidator.java +++ b/src/main/java/edu/harvard/iq/dataverse/validation/URLValidator.java @@ -1,7 +1,6 @@ package edu.harvard.iq.dataverse.validation; -import edu.harvard.iq.dataverse.util.BundleUtil; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; import org.apache.commons.validator.routines.UrlValidator; /** diff --git a/src/main/java/edu/harvard/iq/dataverse/validation/ValidateEmail.java b/src/main/java/edu/harvard/iq/dataverse/validation/ValidateEmail.java index 310dc950858..6ec677bd7a8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/validation/ValidateEmail.java +++ b/src/main/java/edu/harvard/iq/dataverse/validation/ValidateEmail.java @@ -11,8 +11,8 @@ import java.lang.annotation.Retention; import java.lang.annotation.Target; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; /** * * @author skraffmi diff --git a/src/main/java/edu/harvard/iq/dataverse/validation/ValidateURL.java b/src/main/java/edu/harvard/iq/dataverse/validation/ValidateURL.java index 5aaab0c2e8e..3834b119598 100644 --- a/src/main/java/edu/harvard/iq/dataverse/validation/ValidateURL.java +++ b/src/main/java/edu/harvard/iq/dataverse/validation/ValidateURL.java @@ -6,8 +6,8 @@ import java.lang.annotation.Retention; import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Target; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; @Target({FIELD}) @Retention(RUNTIME) diff --git a/src/main/java/edu/harvard/iq/dataverse/validation/ValidateUserName.java b/src/main/java/edu/harvard/iq/dataverse/validation/ValidateUserName.java index 0583b70df49..6307edd073a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/validation/ValidateUserName.java +++ b/src/main/java/edu/harvard/iq/dataverse/validation/ValidateUserName.java @@ -10,11 +10,11 @@ import java.lang.annotation.Retention; import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Target; -import javax.validation.Constraint; -import javax.validation.Payload; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Size; -import javax.validation.constraints.Pattern; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import jakarta.validation.constraints.Pattern; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/workflow/PendingWorkflowInvocation.java b/src/main/java/edu/harvard/iq/dataverse/workflow/PendingWorkflowInvocation.java index 577e0f756de..94fefa9bc13 100644 --- a/src/main/java/edu/harvard/iq/dataverse/workflow/PendingWorkflowInvocation.java +++ b/src/main/java/edu/harvard/iq/dataverse/workflow/PendingWorkflowInvocation.java @@ -9,14 +9,14 @@ import java.io.Serializable; import java.util.HashMap; import java.util.Map; -import javax.persistence.ElementCollection; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.Id; -import javax.persistence.ManyToOne; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.OneToOne; +import jakarta.persistence.ElementCollection; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.OneToOne; /** * A workflow whose current step waits for an external system to complete a diff --git a/src/main/java/edu/harvard/iq/dataverse/workflow/Workflow.java b/src/main/java/edu/harvard/iq/dataverse/workflow/Workflow.java index 6c73ed0e64b..bd32c517bc6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/workflow/Workflow.java +++ b/src/main/java/edu/harvard/iq/dataverse/workflow/Workflow.java @@ -6,16 +6,16 @@ import java.util.List; import java.util.Map; import java.util.Objects; -import javax.persistence.CascadeType; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.OneToMany; -import javax.persistence.OrderColumn; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OrderColumn; /** * A list of steps that can be executed with a given context. diff --git a/src/main/java/edu/harvard/iq/dataverse/workflow/WorkflowServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/workflow/WorkflowServiceBean.java index cf78c4f8cdf..47f24c9b8bd 100644 --- a/src/main/java/edu/harvard/iq/dataverse/workflow/WorkflowServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/workflow/WorkflowServiceBean.java @@ -6,7 +6,6 @@ import edu.harvard.iq.dataverse.EjbDataverseEngine; import edu.harvard.iq.dataverse.RoleAssigneeServiceBean; import edu.harvard.iq.dataverse.UserNotification; -import edu.harvard.iq.dataverse.UserNotification.Type; import edu.harvard.iq.dataverse.UserNotificationServiceBean; import edu.harvard.iq.dataverse.authorization.users.ApiToken; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; @@ -33,15 +32,15 @@ import java.util.Optional; import java.util.logging.Level; import java.util.logging.Logger; -import javax.ejb.Asynchronous; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.ejb.TransactionAttribute; -import javax.ejb.TransactionAttributeType; -import javax.inject.Inject; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.TypedQuery; +import jakarta.ejb.Asynchronous; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.ejb.TransactionAttribute; +import jakarta.ejb.TransactionAttributeType; +import jakarta.inject.Inject; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.TypedQuery; /** * Service bean for managing and executing {@link Workflow}s diff --git a/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/ArchivalSubmissionWorkflowStep.java b/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/ArchivalSubmissionWorkflowStep.java index 105af6a00d8..b0567bff107 100644 --- a/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/ArchivalSubmissionWorkflowStep.java +++ b/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/ArchivalSubmissionWorkflowStep.java @@ -1,6 +1,5 @@ package edu.harvard.iq.dataverse.workflow.internalspi; -import edu.harvard.iq.dataverse.DatasetVersion; import edu.harvard.iq.dataverse.engine.command.DataverseRequest; import edu.harvard.iq.dataverse.engine.command.impl.AbstractSubmitToArchiveCommand; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; @@ -10,13 +9,12 @@ import edu.harvard.iq.dataverse.workflow.step.WorkflowStep; import edu.harvard.iq.dataverse.workflow.step.WorkflowStepResult; -import java.lang.reflect.Constructor; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; /** * A step that submits a BagIT bag of the newly published dataset version via a diff --git a/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/AuthorizedExternalStep.java b/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/AuthorizedExternalStep.java index bbe200aaeb3..ee770d4057e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/AuthorizedExternalStep.java +++ b/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/AuthorizedExternalStep.java @@ -6,23 +6,18 @@ import edu.harvard.iq.dataverse.workflow.WorkflowContext.TriggerType; import edu.harvard.iq.dataverse.workflow.step.Failure; import edu.harvard.iq.dataverse.workflow.step.Pending; -import edu.harvard.iq.dataverse.workflow.step.Success; import edu.harvard.iq.dataverse.workflow.step.WorkflowStep; import edu.harvard.iq.dataverse.workflow.step.WorkflowStepResult; import edu.harvard.iq.dataverse.workflows.WorkflowUtil; -import static edu.harvard.iq.dataverse.workflow.step.WorkflowStepResult.OK; - -import java.io.StringReader; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; -import java.util.regex.Pattern; -import javax.json.Json; -import javax.json.JsonObject; +import jakarta.json.Json; +import jakarta.json.JsonObject; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpMethodBase; diff --git a/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java b/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java index 13024f9f68f..124eea801d9 100644 --- a/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java +++ b/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java @@ -27,12 +27,12 @@ import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.JsonValue; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonValue; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; diff --git a/src/main/java/edu/harvard/iq/dataverse/workflow/step/WorkflowStepData.java b/src/main/java/edu/harvard/iq/dataverse/workflow/step/WorkflowStepData.java index a06531a2666..07bcf247533 100644 --- a/src/main/java/edu/harvard/iq/dataverse/workflow/step/WorkflowStepData.java +++ b/src/main/java/edu/harvard/iq/dataverse/workflow/step/WorkflowStepData.java @@ -3,14 +3,14 @@ import edu.harvard.iq.dataverse.workflow.Workflow; import java.io.Serializable; import java.util.Map; -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.ManyToOne; +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.ManyToOne; /** * A database row describing a step in a workflow. Actual steps can be instantiated diff --git a/src/main/java/edu/harvard/iq/dataverse/workflows/WorkflowComment.java b/src/main/java/edu/harvard/iq/dataverse/workflows/WorkflowComment.java index d03afcaa91a..7cfa226d7ba 100644 --- a/src/main/java/edu/harvard/iq/dataverse/workflows/WorkflowComment.java +++ b/src/main/java/edu/harvard/iq/dataverse/workflows/WorkflowComment.java @@ -5,14 +5,14 @@ import java.io.Serializable; import java.sql.Timestamp; import java.util.Date; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; @Entity public class WorkflowComment implements Serializable { diff --git a/src/main/java/edu/harvard/iq/dataverse/workflows/WorkflowUtil.java b/src/main/java/edu/harvard/iq/dataverse/workflows/WorkflowUtil.java index e6e6bfd23c8..456b829ba61 100644 --- a/src/main/java/edu/harvard/iq/dataverse/workflows/WorkflowUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/workflows/WorkflowUtil.java @@ -8,12 +8,11 @@ import java.util.logging.Level; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObject; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; import edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder; -import edu.harvard.iq.dataverse.workflow.internalspi.PauseWithMessageStep; import edu.harvard.iq.dataverse.workflow.step.Failure; import edu.harvard.iq.dataverse.workflow.step.Success; import edu.harvard.iq.dataverse.workflow.step.WorkflowStepResult; diff --git a/src/main/resources/META-INF/batch-jobs/FileSystemImportJob.xml b/src/main/resources/META-INF/batch-jobs/FileSystemImportJob.xml index 167fbdbec5d..0294f15e967 100644 --- a/src/main/resources/META-INF/batch-jobs/FileSystemImportJob.xml +++ b/src/main/resources/META-INF/batch-jobs/FileSystemImportJob.xml @@ -34,14 +34,14 @@ - + - + From 0d60ef2292a41aeaebd9633eb7b84c6f797fa588 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Wed, 28 Jun 2023 17:06:08 +0200 Subject: [PATCH 003/173] refactor(test): migrate application tests to Jakarta EE 10 --- .../AuxiliaryFileServiceBeanTest.java | 7 ++-- .../iq/dataverse/DatasetFieldTypeTest.java | 5 +-- .../dataverse/DatasetFieldValidatorTest.java | 2 +- .../DatasetFieldValueValidatorTest.java | 8 ++--- .../iq/dataverse/DatasetVersionTest.java | 8 ++--- .../iq/dataverse/MailServiceBeanTest.java | 4 +-- .../iq/dataverse/api/AbstractApiBeanTest.java | 17 +++++----- .../harvard/iq/dataverse/api/AccessIT.java | 5 +-- .../edu/harvard/iq/dataverse/api/AdminIT.java | 12 +++---- .../iq/dataverse/api/AuxiliaryFilesIT.java | 10 +++--- .../edu/harvard/iq/dataverse/api/BagIT.java | 4 +-- .../iq/dataverse/api/BatchImportIT.java | 6 ++-- .../iq/dataverse/api/BuiltinUsersIT.java | 11 +++--- .../iq/dataverse/api/DataRetrieverApiIT.java | 4 +-- .../harvard/iq/dataverse/api/DatasetsIT.java | 30 ++++++++-------- .../iq/dataverse/api/DataversesIT.java | 18 +++++----- .../iq/dataverse/api/DataversesTest.java | 6 ++-- .../iq/dataverse/api/DeactivateUsersIT.java | 10 +++--- .../iq/dataverse/api/DeleteUsersIT.java | 12 +++---- .../iq/dataverse/api/DownloadFilesIT.java | 10 +++--- .../iq/dataverse/api/DuplicateFilesIT.java | 10 +++--- .../harvard/iq/dataverse/api/EditDDIIT.java | 4 +-- .../iq/dataverse/api/ExternalToolsIT.java | 16 ++++----- .../iq/dataverse/api/FeedbackApiIT.java | 8 ++--- .../iq/dataverse/api/FileMetadataIT.java | 2 +- .../iq/dataverse/api/FileTypeDetectionIT.java | 10 +++--- .../edu/harvard/iq/dataverse/api/FilesIT.java | 12 +++---- .../edu/harvard/iq/dataverse/api/FitsIT.java | 8 ++--- .../iq/dataverse/api/HarvestingClientsIT.java | 10 +++--- .../iq/dataverse/api/HarvestingServerIT.java | 2 +- .../iq/dataverse/api/InReviewWorkflowIT.java | 17 +++++----- .../edu/harvard/iq/dataverse/api/IndexIT.java | 6 ++-- .../iq/dataverse/api/InvalidCharactersIT.java | 8 ++--- .../harvard/iq/dataverse/api/IpGroupsIT.java | 10 +++--- .../harvard/iq/dataverse/api/LicensesIT.java | 27 ++++----------- .../edu/harvard/iq/dataverse/api/LinkIT.java | 8 ++--- .../harvard/iq/dataverse/api/LogoutIT.java | 2 +- .../iq/dataverse/api/MakeDataCountApiIT.java | 6 ++-- .../iq/dataverse/api/MetadataBlocksIT.java | 4 +-- .../harvard/iq/dataverse/api/MetricsIT.java | 4 +-- .../edu/harvard/iq/dataverse/api/MoveIT.java | 14 ++++---- .../harvard/iq/dataverse/api/NetcdfIT.java | 10 +++--- .../iq/dataverse/api/NotificationsIT.java | 4 +-- .../edu/harvard/iq/dataverse/api/PidsIT.java | 6 ++-- .../edu/harvard/iq/dataverse/api/ProvIT.java | 17 +++++----- .../iq/dataverse/api/RemoteStoreIT.java | 8 ++--- .../harvard/iq/dataverse/api/S3AccessIT.java | 6 ++-- .../harvard/iq/dataverse/api/SearchIT.java | 23 ++++++------- .../api/SignedUrlAuthMechanismIT.java | 4 +-- .../iq/dataverse/api/SignpostingIT.java | 6 ++-- .../iq/dataverse/api/StorageSitesIT.java | 4 +-- .../edu/harvard/iq/dataverse/api/SwordIT.java | 17 +++++----- .../harvard/iq/dataverse/api/TabularIT.java | 8 ++--- .../edu/harvard/iq/dataverse/api/UsersIT.java | 14 ++++---- .../edu/harvard/iq/dataverse/api/UtilIT.java | 14 ++++---- .../api/auth/ApiKeyAuthMechanismTest.java | 2 +- .../auth/BearerTokenAuthMechanismTest.java | 2 +- .../api/auth/CompoundAuthMechanismTest.java | 2 +- .../api/auth/SignedUrlAuthMechanismTest.java | 2 +- .../auth/WorkflowKeyAuthMechanismTest.java | 2 +- .../ApiKeyContainerRequestTestFake.java | 2 +- .../auth/doubles/ApiKeyUriInfoTestFake.java | 4 +-- ...earerTokenKeyContainerRequestTestFake.java | 2 +- .../doubles/ContainerRequestTestFake.java | 4 +-- .../SignedUrlContainerRequestTestFake.java | 2 +- .../doubles/SignedUrlUriInfoTestFake.java | 6 ++-- .../api/auth/doubles/UriInfoTestFake.java | 8 ++--- .../WorkflowKeyContainerRequestTestFake.java | 2 +- .../doubles/WorkflowKeyUriInfoTestFake.java | 4 +-- .../api/filesystem/FileRecordJobIT.java | 2 +- .../api/util/JsonResponseBuilderTest.java | 2 +- .../MailDomainGroupServiceBeanTest.java | 5 ++- .../oauth2/OAuth2LoginBackingBeanTest.java | 8 ++--- .../oauth2/impl/GoogleOAuth2APTest.java | 2 +- .../providers/shib/ShibUtilTest.java | 2 +- .../users/AuthenticatedUserTest.java | 4 +-- .../dataverse/branding/BrandingUtilTest.java | 4 +-- .../DataCaptureModuleServiceBeanIT.java | 8 ++--- .../DataCaptureModuleUtilTest.java | 6 ++-- .../dataverse/DataverseUtilTest.java | 2 +- .../dataverse/engine/TestCommandContext.java | 2 +- .../dataverse/engine/TestEntityManager.java | 30 ++++++++-------- .../command/impl/CreateRoleCommandTest.java | 4 +-- .../command/impl/MoveDatasetCommandTest.java | 34 +++++++++---------- .../impl/MoveDataverseCommandTest.java | 4 +-- .../impl/RequestRsyncScriptCommandTest.java | 3 +- .../ReturnDatasetToAuthorCommandTest.java | 6 ++-- .../SubmitDatasetForReviewCommandTest.java | 6 ++-- .../iq/dataverse/export/DDIExporterTest.java | 4 +-- .../export/OpenAireExporterTest.java | 9 ++--- .../export/SchemaDotOrgExporterTest.java | 3 +- .../dublincore/DublinCoreExportUtilTest.java | 6 ++-- .../ExternalToolHandlerTest.java | 4 +-- .../ExternalToolServiceBeanTest.java | 4 +-- .../externaltools/ExternalToolTest.java | 2 +- .../dataverse/feedback/FeedbackUtilTest.java | 14 +++----- .../dataverse/ingest/IngestFrequencyTest.java | 2 +- .../iq/dataverse/ingest/IngestUtilTest.java | 6 ++-- .../locality/StorageSiteUtilTest.java | 4 +-- .../DatasetMetricsServiceBeanTest.java | 6 ++-- .../MakeDataCountLoggingServiceBeanTest.java | 2 +- .../makedatacount/MakeDataCountUtilTest.java | 4 +-- .../iq/dataverse/metrics/MetricsUtilTest.java | 8 ++--- .../dataverse/mocks/MockDatasetFieldSvc.java | 2 +- .../PasswordResetServiceBeanTest.java | 4 +-- .../dataverse/pidproviders/PidUtilTest.java | 5 ++- ...sitoryStorageAbstractionLayerUtilTest.java | 4 +-- .../search/SolrSearchResultTest.java | 6 ++-- .../iq/dataverse/util/MockResponse.java | 16 ++++----- .../dataverse/util/PersonOrOrgUtilTest.java | 2 +- .../util/json/BriefJsonPrinterTest.java | 7 ++-- .../dataverse/util/json/JsonParserTest.java | 14 ++++---- .../dataverse/util/json/JsonPrinterTest.java | 8 ++--- .../validation/EMailValidatorTest.java | 6 ++-- .../validation/URLValidatorTest.java | 6 ++-- .../validation/UserNameValidatorTest.java | 6 ++-- 116 files changed, 404 insertions(+), 456 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/AuxiliaryFileServiceBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/AuxiliaryFileServiceBeanTest.java index ad97eba137c..f04a9e50352 100644 --- a/src/test/java/edu/harvard/iq/dataverse/AuxiliaryFileServiceBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/AuxiliaryFileServiceBeanTest.java @@ -2,16 +2,15 @@ import java.util.Arrays; import java.util.List; -import javax.persistence.EntityManager; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.EntityManager; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import static org.junit.Assert.assertEquals; import org.junit.Test; import org.junit.Before; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentMatchers; -import org.mockito.Matchers; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldTypeTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldTypeTest.java index ed17bd229d9..5538ad9c11f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldTypeTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldTypeTest.java @@ -6,10 +6,7 @@ package edu.harvard.iq.dataverse; import edu.harvard.iq.dataverse.search.SolrField; -import java.util.Collection; -import java.util.List; -import java.util.Set; -import javax.faces.model.SelectItem; +import jakarta.faces.model.SelectItem; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldValidatorTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldValidatorTest.java index 99482dd9401..a59eaa7fa74 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldValidatorTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldValidatorTest.java @@ -5,7 +5,7 @@ */ package edu.harvard.iq.dataverse; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidatorContext; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldValueValidatorTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldValueValidatorTest.java index ceaa69ade4e..f4af88818a5 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldValueValidatorTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldValueValidatorTest.java @@ -7,10 +7,10 @@ import java.util.Set; import java.util.regex.Pattern; -import javax.validation.ConstraintValidatorContext; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; +import jakarta.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetVersionTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetVersionTest.java index a8e011d0036..4cd6c4dfaa7 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetVersionTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetVersionTest.java @@ -14,10 +14,10 @@ import java.util.Date; import java.util.List; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonObject; -import javax.json.JsonReader; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; diff --git a/src/test/java/edu/harvard/iq/dataverse/MailServiceBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/MailServiceBeanTest.java index 025e3fbb3f7..32bf9702ee7 100644 --- a/src/test/java/edu/harvard/iq/dataverse/MailServiceBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/MailServiceBeanTest.java @@ -7,11 +7,11 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; -import javax.mail.internet.InternetAddress; +import jakarta.mail.internet.InternetAddress; import java.io.UnsupportedEncodingException; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertTrue; class MailServiceBeanTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/AbstractApiBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/api/AbstractApiBeanTest.java index 3e088c184ad..d16d218d54b 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/AbstractApiBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/AbstractApiBeanTest.java @@ -1,19 +1,18 @@ package edu.harvard.iq.dataverse.api; -import edu.harvard.iq.dataverse.util.MockResponse; import java.io.StringReader; import java.io.StringWriter; import java.util.HashMap; import java.util.Map; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.JsonReader; -import javax.json.JsonWriter; -import javax.json.JsonWriterFactory; -import javax.json.stream.JsonGenerator; -import javax.ws.rs.core.Response; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonReader; +import jakarta.json.JsonWriter; +import jakarta.json.JsonWriterFactory; +import jakarta.json.stream.JsonGenerator; +import jakarta.ws.rs.core.Response; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/AccessIT.java b/src/test/java/edu/harvard/iq/dataverse/api/AccessIT.java index d6aac80b435..b7bdb17ec83 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/AccessIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/AccessIT.java @@ -10,7 +10,6 @@ import com.jayway.restassured.path.json.JsonPath; import com.jayway.restassured.response.Response; import edu.harvard.iq.dataverse.DataFile; -import static edu.harvard.iq.dataverse.api.UtilIT.API_TOKEN_HTTP_HEADER; import edu.harvard.iq.dataverse.util.FileUtil; import java.io.IOException; import java.util.zip.ZipInputStream; @@ -19,11 +18,9 @@ import org.junit.Test; import java.util.zip.ZipEntry; import java.io.ByteArrayOutputStream; -import java.io.File; import java.io.InputStream; -import java.nio.file.Path; import java.util.HashMap; -import static javax.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.OK; import org.hamcrest.collection.IsMapContaining; import static junit.framework.Assert.assertEquals; import static org.junit.Assert.assertNotNull; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/AdminIT.java b/src/test/java/edu/harvard/iq/dataverse/api/AdminIT.java index 2ba06314ddb..c9d262f6437 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/AdminIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/AdminIT.java @@ -15,8 +15,8 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import static javax.ws.rs.core.Response.Status.FORBIDDEN; -import static javax.ws.rs.core.Response.Status.BAD_REQUEST; +import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; +import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; import org.junit.Test; import org.junit.BeforeClass; @@ -24,10 +24,10 @@ import java.util.UUID; import java.util.logging.Logger; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR; -import static javax.ws.rs.core.Response.Status.OK; -import static javax.ws.rs.core.Response.Status.UNAUTHORIZED; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR; +import static jakarta.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; import static junit.framework.Assert.assertEquals; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.notNullValue; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/AuxiliaryFilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/AuxiliaryFilesIT.java index 0e404f6ba97..08643b2f018 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/AuxiliaryFilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/AuxiliaryFilesIT.java @@ -7,11 +7,11 @@ import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; -import static javax.ws.rs.core.Response.Status.CONFLICT; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.FORBIDDEN; -import static javax.ws.rs.core.Response.Status.NOT_FOUND; -import static javax.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.CONFLICT; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; +import static jakarta.ws.rs.core.Response.Status.NOT_FOUND; +import static jakarta.ws.rs.core.Response.Status.OK; import static org.hamcrest.CoreMatchers.equalTo; import org.junit.Assert; import static org.junit.Assert.assertTrue; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/BagIT.java b/src/test/java/edu/harvard/iq/dataverse/api/BagIT.java index 4ac76ac846d..d3ca498e447 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/BagIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/BagIT.java @@ -4,8 +4,8 @@ import com.jayway.restassured.response.Response; import edu.harvard.iq.dataverse.engine.command.impl.LocalSubmitToArchiveCommand; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.OK; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/BatchImportIT.java b/src/test/java/edu/harvard/iq/dataverse/api/BatchImportIT.java index 89ad79817d8..aa0fb0d4a1e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/BatchImportIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/BatchImportIT.java @@ -7,9 +7,9 @@ import java.util.logging.Logger; import org.junit.BeforeClass; import org.junit.Test; -import static javax.ws.rs.core.Response.Status.ACCEPTED; -import static javax.ws.rs.core.Response.Status.OK; -import static javax.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.ACCEPTED; +import static jakarta.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.CREATED; import org.hamcrest.CoreMatchers; public class BatchImportIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/BuiltinUsersIT.java b/src/test/java/edu/harvard/iq/dataverse/api/BuiltinUsersIT.java index 301cd24b35b..36a56950ec3 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/BuiltinUsersIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/BuiltinUsersIT.java @@ -15,17 +15,16 @@ import java.util.logging.Logger; import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.json.Json; -import javax.json.JsonObjectBuilder; -import static javax.ws.rs.core.Response.Status.OK; -import static javax.ws.rs.core.Response.Status.FORBIDDEN; -import static javax.ws.rs.core.Response.Status.UNAUTHORIZED; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; +import static jakarta.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; +import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; import static junit.framework.Assert.assertEquals; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.Matchers.startsWith; import static org.junit.Assert.assertTrue; import org.junit.BeforeClass; -import org.junit.Ignore; import org.junit.Test; public class BuiltinUsersIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java index 69d5db08744..69d9c78d602 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java @@ -8,8 +8,8 @@ import java.util.ArrayList; -import static javax.ws.rs.core.Response.Status.OK; -import static javax.ws.rs.core.Response.Status.UNAUTHORIZED; +import static jakarta.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java index 687ab453d24..4f0fffa0e8e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java @@ -17,17 +17,17 @@ import java.util.List; import java.util.Map; -import javax.json.JsonObject; - -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.FORBIDDEN; -import static javax.ws.rs.core.Response.Status.OK; -import static javax.ws.rs.core.Response.Status.UNAUTHORIZED; -import static javax.ws.rs.core.Response.Status.NOT_FOUND; -import static javax.ws.rs.core.Response.Status.BAD_REQUEST; -import static javax.ws.rs.core.Response.Status.METHOD_NOT_ALLOWED; -import static javax.ws.rs.core.Response.Status.CONFLICT; -import static javax.ws.rs.core.Response.Status.NO_CONTENT; +import jakarta.json.JsonObject; + +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; +import static jakarta.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; +import static jakarta.ws.rs.core.Response.Status.NOT_FOUND; +import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; +import static jakarta.ws.rs.core.Response.Status.METHOD_NOT_ALLOWED; +import static jakarta.ws.rs.core.Response.Status.CONFLICT; +import static jakarta.ws.rs.core.Response.Status.NO_CONTENT; import edu.harvard.iq.dataverse.DataFile; @@ -67,10 +67,10 @@ import java.nio.file.Files; import java.util.ArrayList; import java.util.HashMap; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonObjectBuilder; -import javax.ws.rs.core.Response.Status; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonObjectBuilder; +import jakarta.ws.rs.core.Response.Status; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java index 4a4095e6c91..9ef7e571e0c 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java @@ -13,16 +13,15 @@ import java.nio.file.Paths; import java.util.Arrays; import java.util.List; -import java.util.logging.Level; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR; -import javax.ws.rs.core.Response.Status; -import static javax.ws.rs.core.Response.Status.BAD_REQUEST; -import static javax.ws.rs.core.Response.Status.OK; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR; +import jakarta.ws.rs.core.Response.Status; +import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; +import static jakarta.ws.rs.core.Response.Status.OK; import static junit.framework.Assert.assertEquals; import org.junit.BeforeClass; import org.junit.Test; @@ -33,7 +32,6 @@ import static org.junit.Assert.assertTrue; import java.nio.file.Files; import com.jayway.restassured.path.json.JsonPath; -import static javax.ws.rs.core.Response.Status.OK; import org.hamcrest.CoreMatchers; import org.hamcrest.Matchers; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DataversesTest.java b/src/test/java/edu/harvard/iq/dataverse/api/DataversesTest.java index 1ebba65c9c4..75d1259e45d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DataversesTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DataversesTest.java @@ -31,9 +31,9 @@ import org.mockito.Mockito; import org.mockito.junit.MockitoJUnitRunner; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.core.Response; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.core.Response; import java.util.Arrays; import java.util.Collections; import java.util.List; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DeactivateUsersIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DeactivateUsersIT.java index 801c7cbf7e7..3ffca21d5e6 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DeactivateUsersIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DeactivateUsersIT.java @@ -7,11 +7,11 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import static javax.ws.rs.core.Response.Status.BAD_REQUEST; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.FORBIDDEN; -import static javax.ws.rs.core.Response.Status.OK; -import static javax.ws.rs.core.Response.Status.UNAUTHORIZED; +import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; +import static jakarta.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.startsWith; import org.junit.BeforeClass; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DeleteUsersIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DeleteUsersIT.java index cae1d0e210a..e4c72cf4e1d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DeleteUsersIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DeleteUsersIT.java @@ -11,12 +11,12 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import javax.json.Json; -import javax.json.JsonObjectBuilder; -import static javax.ws.rs.core.Response.Status.BAD_REQUEST; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.OK; -import static javax.ws.rs.core.Response.Status.UNAUTHORIZED; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; +import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; import static junit.framework.Assert.assertEquals; import static org.hamcrest.CoreMatchers.equalTo; import org.junit.BeforeClass; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DownloadFilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DownloadFilesIT.java index 7d5adf95507..dc30c53c8e5 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DownloadFilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DownloadFilesIT.java @@ -16,11 +16,11 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.FORBIDDEN; -import static javax.ws.rs.core.Response.Status.OK; -import static javax.ws.rs.core.Response.Status.UNAUTHORIZED; -import static javax.ws.rs.core.Response.Status.BAD_REQUEST; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; +import static jakarta.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; +import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; import static org.hamcrest.CoreMatchers.equalTo; import org.junit.Assert; import static org.junit.Assert.assertTrue; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DuplicateFilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DuplicateFilesIT.java index 6227e96fdfa..19adb7ba98f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DuplicateFilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DuplicateFilesIT.java @@ -9,11 +9,11 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import javax.json.Json; -import javax.json.JsonObjectBuilder; -import static javax.ws.rs.core.Response.Status.BAD_REQUEST; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.OK; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; +import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.OK; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.nullValue; import org.junit.BeforeClass; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/EditDDIIT.java b/src/test/java/edu/harvard/iq/dataverse/api/EditDDIIT.java index 1775649c3dd..3ed8215b34d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/EditDDIIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/EditDDIIT.java @@ -3,8 +3,6 @@ import com.jayway.restassured.RestAssured; import com.jayway.restassured.path.json.JsonPath; import com.jayway.restassured.response.Response; -import static edu.harvard.iq.dataverse.api.AccessIT.apiToken; -import static edu.harvard.iq.dataverse.api.AccessIT.datasetId; import edu.harvard.iq.dataverse.datavariable.VarGroup; @@ -28,7 +26,7 @@ import javax.xml.stream.XMLStreamException; -import static javax.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.OK; import static junit.framework.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/ExternalToolsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/ExternalToolsIT.java index cdebeddb7bc..3fbc16769d0 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/ExternalToolsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/ExternalToolsIT.java @@ -8,14 +8,14 @@ import java.io.StringReader; import java.nio.file.Path; import java.nio.file.Paths; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.JsonReader; -import static javax.ws.rs.core.Response.Status.BAD_REQUEST; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.OK; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonReader; +import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.OK; import org.hamcrest.CoreMatchers; import org.hamcrest.Matchers; import org.junit.BeforeClass; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FeedbackApiIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FeedbackApiIT.java index bfe4a58abbf..f61468e28ef 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FeedbackApiIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FeedbackApiIT.java @@ -3,10 +3,10 @@ import com.jayway.restassured.RestAssured; import com.jayway.restassured.path.json.JsonPath; import com.jayway.restassured.response.Response; -import javax.json.Json; -import javax.json.JsonObjectBuilder; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.OK; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.OK; import org.hamcrest.CoreMatchers; import org.junit.BeforeClass; import org.junit.Test; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FileMetadataIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FileMetadataIT.java index 1ca7c99be8e..b05c81abf6a 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FileMetadataIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FileMetadataIT.java @@ -13,7 +13,7 @@ import java.util.UUID; import static com.jayway.restassured.RestAssured.given; -import static javax.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.OK; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.fail; import static org.hamcrest.CoreMatchers.equalTo; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FileTypeDetectionIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FileTypeDetectionIT.java index 10ac9192205..aeab3c00777 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FileTypeDetectionIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FileTypeDetectionIT.java @@ -3,11 +3,11 @@ import com.jayway.restassured.RestAssured; import com.jayway.restassured.path.json.JsonPath; import com.jayway.restassured.response.Response; -import javax.json.Json; -import javax.json.JsonObjectBuilder; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.OK; -import static javax.ws.rs.core.Response.Status.UNAUTHORIZED; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.nullValue; import org.junit.BeforeClass; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java index 43dc1381221..6945f498490 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java @@ -10,27 +10,25 @@ import com.jayway.restassured.path.json.JsonPath; import static com.jayway.restassured.path.json.JsonPath.with; import com.jayway.restassured.path.xml.XmlPath; -import static edu.harvard.iq.dataverse.api.AccessIT.apiToken; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import edu.harvard.iq.dataverse.util.BundleUtil; -import edu.harvard.iq.dataverse.util.StringUtil; import edu.harvard.iq.dataverse.util.SystemConfig; import java.io.File; import java.io.IOException; import static java.lang.Thread.sleep; -import java.math.BigDecimal; + import java.nio.file.Path; import java.nio.file.Paths; import java.text.MessageFormat; import java.util.Arrays; import java.util.Collections; import java.util.Map; -import java.util.ResourceBundle; -import javax.json.Json; -import javax.json.JsonObjectBuilder; -import static javax.ws.rs.core.Response.Status.*; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; + +import static jakarta.ws.rs.core.Response.Status.*; import static junit.framework.Assert.assertEquals; import org.hamcrest.CoreMatchers; import static org.hamcrest.CoreMatchers.equalTo; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FitsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FitsIT.java index b154205ce2d..66c81898090 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FitsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FitsIT.java @@ -6,10 +6,10 @@ import java.io.IOException; import java.util.List; import java.util.Map; -import javax.json.Json; -import javax.json.JsonObject; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.OK; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.OK; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertTrue; import org.junit.BeforeClass; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/HarvestingClientsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/HarvestingClientsIT.java index a470bd8fb27..3e36da415f3 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/HarvestingClientsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/HarvestingClientsIT.java @@ -1,16 +1,16 @@ package edu.harvard.iq.dataverse.api; import java.util.logging.Logger; -import java.util.logging.Level; + import com.jayway.restassured.RestAssured; import static com.jayway.restassured.RestAssured.given; import com.jayway.restassured.path.json.JsonPath; import org.junit.Test; import com.jayway.restassured.response.Response; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.UNAUTHORIZED; -import static javax.ws.rs.core.Response.Status.ACCEPTED; -import static javax.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; +import static jakarta.ws.rs.core.Response.Status.ACCEPTED; +import static jakarta.ws.rs.core.Response.Status.OK; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/HarvestingServerIT.java b/src/test/java/edu/harvard/iq/dataverse/api/HarvestingServerIT.java index 276909d1c23..65f35f76cb1 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/HarvestingServerIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/HarvestingServerIT.java @@ -13,7 +13,7 @@ import com.jayway.restassured.path.xml.element.Node; import java.util.ArrayList; import java.util.Collections; -import static javax.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.OK; import static org.hamcrest.CoreMatchers.equalTo; import java.util.List; import java.util.Set; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/InReviewWorkflowIT.java b/src/test/java/edu/harvard/iq/dataverse/api/InReviewWorkflowIT.java index 89aeaa6b2ee..ca082c5ce95 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/InReviewWorkflowIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/InReviewWorkflowIT.java @@ -4,17 +4,16 @@ import com.jayway.restassured.path.json.JsonPath; import com.jayway.restassured.path.xml.XmlPath; import com.jayway.restassured.response.Response; -import static edu.harvard.iq.dataverse.api.AccessIT.apiToken; import edu.harvard.iq.dataverse.authorization.DataverseRole; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonObjectBuilder; -import static javax.ws.rs.core.Response.Status.BAD_REQUEST; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.FORBIDDEN; -import static javax.ws.rs.core.Response.Status.OK; -import static javax.ws.rs.core.Response.Status.UNAUTHORIZED; -import static javax.ws.rs.core.Response.Status.NO_CONTENT; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; +import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; +import static jakarta.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; +import static jakarta.ws.rs.core.Response.Status.NO_CONTENT; import static org.hamcrest.CoreMatchers.equalTo; import org.junit.Assert; import static org.junit.Assert.assertTrue; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/IndexIT.java b/src/test/java/edu/harvard/iq/dataverse/api/IndexIT.java index 313c4c2cfaf..72d834786a9 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/IndexIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/IndexIT.java @@ -8,12 +8,12 @@ import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import java.util.ArrayList; import java.util.logging.Logger; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.NO_CONTENT; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.NO_CONTENT; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; -import static javax.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.OK; import static junit.framework.Assert.assertEquals; import org.hamcrest.CoreMatchers; import static org.hamcrest.CoreMatchers.equalTo; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/InvalidCharactersIT.java b/src/test/java/edu/harvard/iq/dataverse/api/InvalidCharactersIT.java index 2fb412ef1cc..63af8ea13e1 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/InvalidCharactersIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/InvalidCharactersIT.java @@ -6,10 +6,10 @@ import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; -import javax.json.Json; -import javax.json.JsonObjectBuilder; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.OK; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.OK; import org.hamcrest.Matchers; import org.junit.BeforeClass; import org.junit.Test; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/IpGroupsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/IpGroupsIT.java index 88b8a9fc458..d73f07bd530 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/IpGroupsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/IpGroupsIT.java @@ -7,11 +7,11 @@ import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonObjectBuilder; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.FORBIDDEN; -import static javax.ws.rs.core.Response.Status.OK; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; +import static jakarta.ws.rs.core.Response.Status.OK; import static junit.framework.Assert.assertEquals; import static org.hamcrest.CoreMatchers.equalTo; import org.junit.BeforeClass; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/LicensesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/LicensesIT.java index d6bfdb96777..4e2e5e117fc 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/LicensesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/LicensesIT.java @@ -3,36 +3,21 @@ import com.jayway.restassured.RestAssured; import com.jayway.restassured.path.json.JsonPath; import com.jayway.restassured.response.Response; -import edu.harvard.iq.dataverse.DataFile; -import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinAuthenticationProvider; -import edu.harvard.iq.dataverse.authorization.providers.oauth2.impl.GitHubOAuth2AP; -import edu.harvard.iq.dataverse.authorization.providers.oauth2.impl.OrcidOAuth2AP; -import edu.harvard.iq.dataverse.settings.SettingsServiceBean; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import static javax.ws.rs.core.Response.Status.FORBIDDEN; -import static javax.ws.rs.core.Response.Status.BAD_REQUEST; +import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; +import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; import org.junit.Test; import org.junit.BeforeClass; -import java.util.Map; -import java.util.UUID; import java.util.logging.Logger; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR; -import static javax.ws.rs.core.Response.Status.OK; -import static javax.ws.rs.core.Response.Status.UNAUTHORIZED; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR; +import static jakarta.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; import static org.junit.Assert.*; -import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.notNullValue; import static org.junit.Assert.assertTrue; -import org.junit.Ignore; public class LicensesIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java b/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java index 76e9b7d6bc8..5b0c8e56467 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java @@ -3,11 +3,11 @@ import com.jayway.restassured.RestAssured; import com.jayway.restassured.path.json.JsonPath; import com.jayway.restassured.response.Response; -import edu.harvard.iq.dataverse.util.BundleUtil; + import java.util.logging.Logger; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.FORBIDDEN; -import static javax.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; +import static jakarta.ws.rs.core.Response.Status.OK; import static org.hamcrest.CoreMatchers.equalTo; import org.junit.BeforeClass; import org.junit.Test; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/LogoutIT.java b/src/test/java/edu/harvard/iq/dataverse/api/LogoutIT.java index f07ce970914..eaa6fc5270f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/LogoutIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/LogoutIT.java @@ -5,7 +5,7 @@ import org.junit.BeforeClass; import org.junit.jupiter.api.Test; -import static javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR; +import static jakarta.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR; import static org.junit.jupiter.api.Assertions.assertEquals; public class LogoutIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/MakeDataCountApiIT.java b/src/test/java/edu/harvard/iq/dataverse/api/MakeDataCountApiIT.java index c210d471ce2..c85920807fd 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/MakeDataCountApiIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/MakeDataCountApiIT.java @@ -4,9 +4,9 @@ import com.jayway.restassured.response.Response; import java.io.File; import java.io.IOException; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.OK; -import static javax.ws.rs.core.Response.Status.BAD_REQUEST; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; import org.apache.commons.io.FileUtils; import static org.hamcrest.CoreMatchers.equalTo; import org.junit.BeforeClass; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/MetadataBlocksIT.java b/src/test/java/edu/harvard/iq/dataverse/api/MetadataBlocksIT.java index c958c339daf..f941cd0b0a9 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/MetadataBlocksIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/MetadataBlocksIT.java @@ -6,8 +6,8 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.OK; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assumptions.assumeFalse; import static org.junit.jupiter.api.Assumptions.assumeTrue; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/MetricsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/MetricsIT.java index f6478bf379e..90b87af1a91 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/MetricsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/MetricsIT.java @@ -3,8 +3,8 @@ import com.jayway.restassured.RestAssured; import com.jayway.restassured.response.Response; import edu.harvard.iq.dataverse.metrics.MetricsUtil; -import static javax.ws.rs.core.Response.Status.BAD_REQUEST; -import static javax.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; +import static jakarta.ws.rs.core.Response.Status.OK; import org.junit.AfterClass; import static org.junit.Assert.assertEquals; import org.junit.BeforeClass; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/MoveIT.java b/src/test/java/edu/harvard/iq/dataverse/api/MoveIT.java index ddb08e82165..b879946cb66 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/MoveIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/MoveIT.java @@ -8,13 +8,13 @@ import java.io.StringReader; import java.util.List; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonObject; -import static javax.ws.rs.core.Response.Status.BAD_REQUEST; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.FORBIDDEN; -import static javax.ws.rs.core.Response.Status.OK; -import static javax.ws.rs.core.Response.Status.UNAUTHORIZED; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; +import static jakarta.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; import org.hamcrest.CoreMatchers; import static org.hamcrest.CoreMatchers.equalTo; import org.junit.Assert; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/NetcdfIT.java b/src/test/java/edu/harvard/iq/dataverse/api/NetcdfIT.java index 89ae1b9202e..0b1862ad687 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/NetcdfIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/NetcdfIT.java @@ -7,11 +7,11 @@ import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; -import javax.json.Json; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.FORBIDDEN; -import static javax.ws.rs.core.Response.Status.NOT_FOUND; -import static javax.ws.rs.core.Response.Status.OK; +import jakarta.json.Json; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; +import static jakarta.ws.rs.core.Response.Status.NOT_FOUND; +import static jakarta.ws.rs.core.Response.Status.OK; import org.hamcrest.CoreMatchers; import static org.hamcrest.CoreMatchers.equalTo; import org.junit.BeforeClass; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/NotificationsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/NotificationsIT.java index 09a14e2d6ad..f7955726b88 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/NotificationsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/NotificationsIT.java @@ -4,8 +4,8 @@ import com.jayway.restassured.path.json.JsonPath; import com.jayway.restassured.response.Response; import java.util.logging.Logger; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.OK; import static org.hamcrest.CoreMatchers.equalTo; import org.junit.BeforeClass; import org.junit.Test; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/PidsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/PidsIT.java index c7ca70e0e1d..7983bf3708e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/PidsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/PidsIT.java @@ -3,9 +3,9 @@ import com.jayway.restassured.RestAssured; import com.jayway.restassured.path.json.JsonPath; import com.jayway.restassured.response.Response; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.FORBIDDEN; -import static javax.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; +import static jakarta.ws.rs.core.Response.Status.OK; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/ProvIT.java b/src/test/java/edu/harvard/iq/dataverse/api/ProvIT.java index 52143eb9981..dc3c01099e3 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/ProvIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/ProvIT.java @@ -3,18 +3,17 @@ import com.jayway.restassured.RestAssured; import com.jayway.restassured.path.json.JsonPath; import com.jayway.restassured.response.Response; -import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonObject; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.OK; -import static javax.ws.rs.core.Response.Status.BAD_REQUEST; -import static javax.ws.rs.core.Response.Status.FORBIDDEN; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; +import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; import static junit.framework.Assert.assertEquals; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.notNullValue; -import org.junit.Before; + import org.junit.BeforeClass; import org.junit.Test; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/RemoteStoreIT.java b/src/test/java/edu/harvard/iq/dataverse/api/RemoteStoreIT.java index ae5bc8b7316..286013f7727 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/RemoteStoreIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/RemoteStoreIT.java @@ -2,10 +2,10 @@ import com.jayway.restassured.RestAssured; import com.jayway.restassured.response.Response; -import javax.json.Json; -import javax.json.JsonObjectBuilder; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.OK; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.OK; import org.junit.BeforeClass; import org.junit.Test; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/S3AccessIT.java b/src/test/java/edu/harvard/iq/dataverse/api/S3AccessIT.java index 29cb6895bba..e39172b4c73 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/S3AccessIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/S3AccessIT.java @@ -5,15 +5,13 @@ import com.jayway.restassured.path.json.JsonPath; import com.jayway.restassured.response.Response; import java.util.logging.Logger; -import static javax.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.OK; import static junit.framework.Assert.assertEquals; -import static org.hamcrest.CoreMatchers.equalTo; + import org.junit.BeforeClass; import org.junit.Test; import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.Matchers.startsWith; -import org.junit.After; -import org.junit.Assert; /** * NOTE: This test WILL NOT pass if your installation is not configured for Amazon S3 storage. diff --git a/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java b/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java index f3def90a005..b6823ddbea4 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java @@ -6,8 +6,8 @@ import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import java.util.logging.Level; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonObject; +import jakarta.json.Json; +import jakarta.json.JsonObject; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -16,10 +16,10 @@ import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.util.Base64; -import javax.json.JsonArray; -import static javax.ws.rs.core.Response.Status.BAD_REQUEST; -import static javax.ws.rs.core.Response.Status.OK; -import static javax.ws.rs.core.Response.Status.FORBIDDEN; +import jakarta.json.JsonArray; +import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; +import static jakarta.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; import org.hamcrest.CoreMatchers; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -29,15 +29,14 @@ import static junit.framework.Assert.assertEquals; import static java.lang.Thread.sleep; import javax.imageio.ImageIO; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.NOT_FOUND; -import static javax.ws.rs.core.Response.Status.OK; -import static javax.ws.rs.core.Response.Status.UNAUTHORIZED; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.NOT_FOUND; +import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; import org.hamcrest.Matchers; import org.junit.After; import static org.junit.Assert.assertNotEquals; -import static java.lang.Thread.sleep; -import javax.json.JsonObjectBuilder; + +import jakarta.json.JsonObjectBuilder; public class SearchIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/SignedUrlAuthMechanismIT.java b/src/test/java/edu/harvard/iq/dataverse/api/SignedUrlAuthMechanismIT.java index e30bf40082b..729b4f85e9f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/SignedUrlAuthMechanismIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/SignedUrlAuthMechanismIT.java @@ -6,8 +6,8 @@ import org.junit.jupiter.api.Test; import static com.jayway.restassured.RestAssured.get; -import static javax.ws.rs.core.Response.Status.OK; -import static javax.ws.rs.core.Response.Status.UNAUTHORIZED; +import static jakarta.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; import static org.junit.jupiter.api.Assertions.assertEquals; public class SignedUrlAuthMechanismIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/SignpostingIT.java b/src/test/java/edu/harvard/iq/dataverse/api/SignpostingIT.java index e22d0740c48..585eac91d18 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/SignpostingIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/SignpostingIT.java @@ -8,14 +8,14 @@ import edu.harvard.iq.dataverse.util.json.JsonUtil; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.OK; import static org.junit.Assert.assertTrue; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.junit.BeforeClass; import org.junit.Test; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/StorageSitesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/StorageSitesIT.java index a33d7d60263..b2f6e6151a1 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/StorageSitesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/StorageSitesIT.java @@ -4,8 +4,8 @@ import com.jayway.restassured.response.Response; import edu.harvard.iq.dataverse.locality.StorageSite; import edu.harvard.iq.dataverse.util.SystemConfig; -import javax.json.Json; -import javax.json.JsonObjectBuilder; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; import org.junit.BeforeClass; import org.junit.Test; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/SwordIT.java b/src/test/java/edu/harvard/iq/dataverse/api/SwordIT.java index 3e3161cb0bc..95d9525f6db 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/SwordIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/SwordIT.java @@ -3,7 +3,6 @@ import com.jayway.restassured.RestAssured; import com.jayway.restassured.path.json.JsonPath; import com.jayway.restassured.response.Response; -import edu.harvard.iq.dataverse.GlobalId; import edu.harvard.iq.dataverse.api.datadeposit.SwordConfigurationImpl; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import java.io.File; @@ -13,14 +12,14 @@ import java.util.List; import java.util.Map; import java.util.logging.Logger; -import static javax.ws.rs.core.Response.Status.BAD_REQUEST; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.FORBIDDEN; -import static javax.ws.rs.core.Response.Status.UNAUTHORIZED; -import static javax.ws.rs.core.Response.Status.METHOD_NOT_ALLOWED; -import static javax.ws.rs.core.Response.Status.NOT_FOUND; -import static javax.ws.rs.core.Response.Status.NO_CONTENT; -import static javax.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; +import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; +import static jakarta.ws.rs.core.Response.Status.METHOD_NOT_ALLOWED; +import static jakarta.ws.rs.core.Response.Status.NOT_FOUND; +import static jakarta.ws.rs.core.Response.Status.NO_CONTENT; +import static jakarta.ws.rs.core.Response.Status.OK; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.Matchers.endsWith; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/TabularIT.java b/src/test/java/edu/harvard/iq/dataverse/api/TabularIT.java index 512080ae569..70267d70f5b 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/TabularIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/TabularIT.java @@ -3,14 +3,12 @@ import com.jayway.restassured.RestAssured; import com.jayway.restassured.path.json.JsonPath; import com.jayway.restassured.response.Response; -import static edu.harvard.iq.dataverse.api.AccessIT.apiToken; -import static edu.harvard.iq.dataverse.api.AccessIT.datasetId; -import static edu.harvard.iq.dataverse.api.AccessIT.tabFile3NameRestricted; + import java.io.File; import java.util.Arrays; import java.util.logging.Logger; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.OK; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java index 07e8ef41d92..76f153721c0 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java @@ -10,13 +10,13 @@ import java.util.ArrayList; import java.util.List; import java.util.UUID; -import javax.json.Json; -import javax.json.JsonObjectBuilder; -import static javax.ws.rs.core.Response.Status.BAD_REQUEST; -import static javax.ws.rs.core.Response.Status.CREATED; -import static javax.ws.rs.core.Response.Status.NOT_FOUND; -import static javax.ws.rs.core.Response.Status.OK; -import static javax.ws.rs.core.Response.Status.UNAUTHORIZED; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; +import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; +import static jakarta.ws.rs.core.Response.Status.CREATED; +import static jakarta.ws.rs.core.Response.Status.NOT_FOUND; +import static jakarta.ws.rs.core.Response.Status.OK; +import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; import static junit.framework.Assert.assertEquals; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.equalTo; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java index e8632933865..8d240d7825e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -1,17 +1,16 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; import com.jayway.restassured.http.ContentType; import com.jayway.restassured.path.json.JsonPath; import com.jayway.restassured.response.Response; import java.util.UUID; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonObjectBuilder; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObject; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -45,7 +44,6 @@ import static com.jayway.restassured.path.xml.XmlPath.from; import static com.jayway.restassured.RestAssured.given; import edu.harvard.iq.dataverse.DatasetField; -import edu.harvard.iq.dataverse.DatasetFieldConstant; import edu.harvard.iq.dataverse.DatasetFieldType; import edu.harvard.iq.dataverse.DatasetFieldValue; import edu.harvard.iq.dataverse.util.StringUtil; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/auth/ApiKeyAuthMechanismTest.java b/src/test/java/edu/harvard/iq/dataverse/api/auth/ApiKeyAuthMechanismTest.java index 5c252f67f0c..486697664e6 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/auth/ApiKeyAuthMechanismTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/auth/ApiKeyAuthMechanismTest.java @@ -11,7 +11,7 @@ import org.junit.jupiter.api.Test; import org.mockito.Mockito; -import javax.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.container.ContainerRequestContext; import static edu.harvard.iq.dataverse.api.auth.ApiKeyAuthMechanism.ACCESS_DATAFILE_PATH_PREFIX; import static edu.harvard.iq.dataverse.api.auth.ApiKeyAuthMechanism.RESPONSE_MESSAGE_BAD_API_KEY; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/auth/BearerTokenAuthMechanismTest.java b/src/test/java/edu/harvard/iq/dataverse/api/auth/BearerTokenAuthMechanismTest.java index 0370daa5ea2..6eaf769e0e8 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/auth/BearerTokenAuthMechanismTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/auth/BearerTokenAuthMechanismTest.java @@ -16,7 +16,7 @@ import org.junit.jupiter.api.Test; import org.mockito.Mockito; -import javax.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.container.ContainerRequestContext; import java.io.IOException; import java.util.Collections; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/auth/CompoundAuthMechanismTest.java b/src/test/java/edu/harvard/iq/dataverse/api/auth/CompoundAuthMechanismTest.java index c09917c55c6..b3435d53ca2 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/auth/CompoundAuthMechanismTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/auth/CompoundAuthMechanismTest.java @@ -7,7 +7,7 @@ import org.junit.jupiter.api.Test; import org.mockito.Mockito; -import javax.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.container.ContainerRequestContext; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/auth/SignedUrlAuthMechanismTest.java b/src/test/java/edu/harvard/iq/dataverse/api/auth/SignedUrlAuthMechanismTest.java index 8518d49c687..74db6e544da 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/auth/SignedUrlAuthMechanismTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/auth/SignedUrlAuthMechanismTest.java @@ -9,7 +9,7 @@ import org.junit.jupiter.api.Test; import org.mockito.Mockito; -import javax.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.container.ContainerRequestContext; import static edu.harvard.iq.dataverse.api.auth.SignedUrlAuthMechanism.RESPONSE_MESSAGE_BAD_SIGNED_URL; import static org.junit.jupiter.api.Assertions.*; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/auth/WorkflowKeyAuthMechanismTest.java b/src/test/java/edu/harvard/iq/dataverse/api/auth/WorkflowKeyAuthMechanismTest.java index 712323a6d5c..3f90fa73fa9 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/auth/WorkflowKeyAuthMechanismTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/auth/WorkflowKeyAuthMechanismTest.java @@ -8,7 +8,7 @@ import org.junit.jupiter.api.Test; import org.mockito.Mockito; -import javax.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.container.ContainerRequestContext; import static edu.harvard.iq.dataverse.api.auth.WorkflowKeyAuthMechanism.RESPONSE_MESSAGE_BAD_WORKFLOW_KEY; import static org.junit.jupiter.api.Assertions.*; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/ApiKeyContainerRequestTestFake.java b/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/ApiKeyContainerRequestTestFake.java index 6046b217c8b..3afa1a06be3 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/ApiKeyContainerRequestTestFake.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/ApiKeyContainerRequestTestFake.java @@ -1,6 +1,6 @@ package edu.harvard.iq.dataverse.api.auth.doubles; -import javax.ws.rs.core.UriInfo; +import jakarta.ws.rs.core.UriInfo; import static edu.harvard.iq.dataverse.api.auth.ApiKeyAuthMechanism.DATAVERSE_API_KEY_REQUEST_HEADER_NAME; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/ApiKeyUriInfoTestFake.java b/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/ApiKeyUriInfoTestFake.java index 8761bd25f4b..495d3810adb 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/ApiKeyUriInfoTestFake.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/ApiKeyUriInfoTestFake.java @@ -1,7 +1,7 @@ package edu.harvard.iq.dataverse.api.auth.doubles; -import javax.ws.rs.core.MultivaluedHashMap; -import javax.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.core.MultivaluedHashMap; +import jakarta.ws.rs.core.MultivaluedMap; import static edu.harvard.iq.dataverse.api.auth.ApiKeyAuthMechanism.DATAVERSE_API_KEY_REQUEST_PARAM_NAME; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/BearerTokenKeyContainerRequestTestFake.java b/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/BearerTokenKeyContainerRequestTestFake.java index 132c165696d..04a66e851c5 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/BearerTokenKeyContainerRequestTestFake.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/BearerTokenKeyContainerRequestTestFake.java @@ -1,6 +1,6 @@ package edu.harvard.iq.dataverse.api.auth.doubles; -import javax.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.HttpHeaders; public class BearerTokenKeyContainerRequestTestFake extends ContainerRequestTestFake { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/ContainerRequestTestFake.java b/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/ContainerRequestTestFake.java index 10a33cc5d15..74f2e9dbb41 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/ContainerRequestTestFake.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/ContainerRequestTestFake.java @@ -1,7 +1,7 @@ package edu.harvard.iq.dataverse.api.auth.doubles; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.core.*; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.core.*; import java.io.InputStream; import java.net.URI; import java.util.*; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/SignedUrlContainerRequestTestFake.java b/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/SignedUrlContainerRequestTestFake.java index 01392b91cf3..df37f6723d3 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/SignedUrlContainerRequestTestFake.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/SignedUrlContainerRequestTestFake.java @@ -1,6 +1,6 @@ package edu.harvard.iq.dataverse.api.auth.doubles; -import javax.ws.rs.core.UriInfo; +import jakarta.ws.rs.core.UriInfo; public class SignedUrlContainerRequestTestFake extends ContainerRequestTestFake { private final UriInfo uriInfo; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/SignedUrlUriInfoTestFake.java b/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/SignedUrlUriInfoTestFake.java index 7b19325de42..fa9da7fc8de 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/SignedUrlUriInfoTestFake.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/SignedUrlUriInfoTestFake.java @@ -2,14 +2,14 @@ import edu.harvard.iq.dataverse.util.UrlSignerUtil; -import javax.ws.rs.core.MultivaluedHashMap; -import javax.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.core.MultivaluedHashMap; +import jakarta.ws.rs.core.MultivaluedMap; import java.net.URI; import static edu.harvard.iq.dataverse.util.UrlSignerUtil.SIGNED_URL_TOKEN; import static edu.harvard.iq.dataverse.util.UrlSignerUtil.SIGNED_URL_USER; -import static javax.ws.rs.HttpMethod.GET; +import static jakarta.ws.rs.HttpMethod.GET; public class SignedUrlUriInfoTestFake extends UriInfoTestFake { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/UriInfoTestFake.java b/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/UriInfoTestFake.java index ba7bffbb5d0..51d20083ec8 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/UriInfoTestFake.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/UriInfoTestFake.java @@ -1,9 +1,9 @@ package edu.harvard.iq.dataverse.api.auth.doubles; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.core.PathSegment; -import javax.ws.rs.core.UriBuilder; -import javax.ws.rs.core.UriInfo; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.core.PathSegment; +import jakarta.ws.rs.core.UriBuilder; +import jakarta.ws.rs.core.UriInfo; import java.net.URI; import java.util.List; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/WorkflowKeyContainerRequestTestFake.java b/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/WorkflowKeyContainerRequestTestFake.java index b726edbd3da..2679ab1cc1d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/WorkflowKeyContainerRequestTestFake.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/WorkflowKeyContainerRequestTestFake.java @@ -1,6 +1,6 @@ package edu.harvard.iq.dataverse.api.auth.doubles; -import javax.ws.rs.core.UriInfo; +import jakarta.ws.rs.core.UriInfo; import static edu.harvard.iq.dataverse.api.auth.WorkflowKeyAuthMechanism.DATAVERSE_WORKFLOW_KEY_REQUEST_HEADER_NAME; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/WorkflowKeyUriInfoTestFake.java b/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/WorkflowKeyUriInfoTestFake.java index 73d55fe45bc..7bfd4326417 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/WorkflowKeyUriInfoTestFake.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/auth/doubles/WorkflowKeyUriInfoTestFake.java @@ -1,7 +1,7 @@ package edu.harvard.iq.dataverse.api.auth.doubles; -import javax.ws.rs.core.MultivaluedHashMap; -import javax.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.core.MultivaluedHashMap; +import jakarta.ws.rs.core.MultivaluedMap; import static edu.harvard.iq.dataverse.api.auth.WorkflowKeyAuthMechanism.DATAVERSE_WORKFLOW_KEY_REQUEST_PARAM_NAME; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/filesystem/FileRecordJobIT.java b/src/test/java/edu/harvard/iq/dataverse/api/filesystem/FileRecordJobIT.java index 7b9f7d5c155..5cfce389ed6 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/filesystem/FileRecordJobIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/filesystem/FileRecordJobIT.java @@ -37,7 +37,7 @@ import org.junit.Test; import org.junit.Ignore; -import javax.batch.runtime.BatchStatus; +import jakarta.batch.runtime.BatchStatus; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/util/JsonResponseBuilderTest.java b/src/test/java/edu/harvard/iq/dataverse/api/util/JsonResponseBuilderTest.java index a6da689da7a..51586127041 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/util/JsonResponseBuilderTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/util/JsonResponseBuilderTest.java @@ -7,7 +7,7 @@ import org.junit.jupiter.params.provider.ValueSource; import org.mockito.Mockito; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/maildomain/MailDomainGroupServiceBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/maildomain/MailDomainGroupServiceBeanTest.java index c260252f131..875cd02cc4c 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/maildomain/MailDomainGroupServiceBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/maildomain/MailDomainGroupServiceBeanTest.java @@ -8,12 +8,11 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import javax.persistence.EntityManager; -import javax.persistence.TypedQuery; +import jakarta.persistence.EntityManager; +import jakarta.persistence.TypedQuery; import java.util.*; import java.util.stream.Stream; diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/OAuth2LoginBackingBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/OAuth2LoginBackingBeanTest.java index 80249cc89e8..f133670e7ab 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/OAuth2LoginBackingBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/OAuth2LoginBackingBeanTest.java @@ -19,10 +19,10 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.omnifaces.util.Faces; -import javax.faces.context.ExternalContext; -import javax.faces.context.FacesContext; -import javax.faces.context.Flash; -import javax.servlet.http.HttpServletRequest; +import jakarta.faces.context.ExternalContext; +import jakarta.faces.context.FacesContext; +import jakarta.faces.context.Flash; +import jakarta.servlet.http.HttpServletRequest; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/GoogleOAuth2APTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/GoogleOAuth2APTest.java index 5cb2788c3ee..d97b0f77daf 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/GoogleOAuth2APTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/GoogleOAuth2APTest.java @@ -2,7 +2,7 @@ import edu.harvard.iq.dataverse.authorization.AuthenticatedUserDisplayInfo; import edu.harvard.iq.dataverse.authorization.providers.oauth2.AbstractOAuth2AuthenticationProvider; -import javax.json.Json; +import jakarta.json.Json; import static org.junit.Assert.assertEquals; import org.junit.Test; diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibUtilTest.java index 58d32b7d2a1..99a307eebc3 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibUtilTest.java @@ -9,7 +9,7 @@ import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import static org.junit.Assert.*; import org.junit.Test; import org.junit.experimental.runners.Enclosed; diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUserTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUserTest.java index 5606bbe6aa3..0c535653c35 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUserTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUserTest.java @@ -22,8 +22,8 @@ import static org.junit.Assert.*; import org.junit.Before; -import javax.json.JsonObject; -import javax.json.JsonString; +import jakarta.json.JsonObject; +import jakarta.json.JsonString; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; diff --git a/src/test/java/edu/harvard/iq/dataverse/branding/BrandingUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/branding/BrandingUtilTest.java index 95deafc0cfe..2b526b8a449 100644 --- a/src/test/java/edu/harvard/iq/dataverse/branding/BrandingUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/branding/BrandingUtilTest.java @@ -7,8 +7,8 @@ import java.util.Arrays; import java.util.logging.Logger; import java.util.stream.Stream; -import javax.mail.internet.AddressException; -import javax.mail.internet.InternetAddress; +import jakarta.mail.internet.AddressException; +import jakarta.mail.internet.InternetAddress; import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.AfterAll; diff --git a/src/test/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleServiceBeanIT.java b/src/test/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleServiceBeanIT.java index c44495be0c2..1c033e08af2 100644 --- a/src/test/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleServiceBeanIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleServiceBeanIT.java @@ -15,11 +15,11 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import static java.lang.Thread.sleep; -import javax.json.Json; -import javax.json.JsonObjectBuilder; -import javax.json.JsonReader; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonReader; /** * These tests are not expected to pass unless you have a Data Capture Module diff --git a/src/test/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleUtilTest.java index a00daef63c2..afb1f0ec851 100644 --- a/src/test/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleUtilTest.java @@ -7,9 +7,9 @@ import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import static edu.harvard.iq.dataverse.mocks.MocksFactory.makeAuthenticatedUser; import java.io.UnsupportedEncodingException; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; import org.apache.http.HttpResponseFactory; import org.apache.http.HttpStatus; import org.apache.http.HttpVersion; diff --git a/src/test/java/edu/harvard/iq/dataverse/dataverse/DataverseUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/dataverse/DataverseUtilTest.java index bf679f8fe97..cae61afda30 100644 --- a/src/test/java/edu/harvard/iq/dataverse/dataverse/DataverseUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/dataverse/DataverseUtilTest.java @@ -9,7 +9,7 @@ import java.util.HashMap; import java.util.Map; -import javax.ws.rs.BadRequestException; +import jakarta.ws.rs.BadRequestException; import org.junit.Assert; import org.junit.Test; diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/TestCommandContext.java b/src/test/java/edu/harvard/iq/dataverse/engine/TestCommandContext.java index 410f0489613..99da9198296 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/TestCommandContext.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/TestCommandContext.java @@ -23,7 +23,7 @@ import edu.harvard.iq.dataverse.util.SystemConfig; import edu.harvard.iq.dataverse.workflow.WorkflowServiceBean; import java.util.Stack; -import javax.persistence.EntityManager; +import jakarta.persistence.EntityManager; /** * A base CommandContext for tests. Provides no-op implementations. Should diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/TestEntityManager.java b/src/test/java/edu/harvard/iq/dataverse/engine/TestEntityManager.java index b1ad74ac2dc..af8b75d5d80 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/TestEntityManager.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/TestEntityManager.java @@ -14,21 +14,21 @@ import java.util.concurrent.atomic.AtomicLong; import java.util.logging.Level; import java.util.logging.Logger; -import javax.persistence.EntityGraph; -import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; -import javax.persistence.EntityTransaction; -import javax.persistence.FlushModeType; -import javax.persistence.Id; -import javax.persistence.LockModeType; -import javax.persistence.Query; -import javax.persistence.StoredProcedureQuery; -import javax.persistence.TypedQuery; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaDelete; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.CriteriaUpdate; -import javax.persistence.metamodel.Metamodel; +import jakarta.persistence.EntityGraph; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.EntityTransaction; +import jakarta.persistence.FlushModeType; +import jakarta.persistence.Id; +import jakarta.persistence.LockModeType; +import jakarta.persistence.Query; +import jakarta.persistence.StoredProcedureQuery; +import jakarta.persistence.TypedQuery; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaDelete; +import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.CriteriaUpdate; +import jakarta.persistence.metamodel.Metamodel; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateRoleCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateRoleCommandTest.java index 243285e69ab..10981fb8d0e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateRoleCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateRoleCommandTest.java @@ -14,8 +14,8 @@ import edu.harvard.iq.dataverse.engine.command.exception.CommandException; import edu.harvard.iq.dataverse.engine.command.exception.IllegalCommandException; import edu.harvard.iq.dataverse.mocks.MocksFactory; -import javax.persistence.EntityManager; -import javax.persistence.TypedQuery; +import jakarta.persistence.EntityManager; +import jakarta.persistence.TypedQuery; import static org.junit.Assert.assertTrue; import org.junit.Before; import org.junit.Test; diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDatasetCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDatasetCommandTest.java index 2474fd72004..2d0f52779c3 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDatasetCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDatasetCommandTest.java @@ -31,23 +31,23 @@ import java.util.Date; import java.util.List; import java.util.Map; -import java.util.concurrent.Future; -import javax.persistence.EntityGraph; -import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; -import javax.persistence.EntityTransaction; -import javax.persistence.FlushModeType; -import javax.persistence.LockModeType; -import javax.persistence.Query; -import javax.persistence.StoredProcedureQuery; -import javax.persistence.TypedQuery; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaDelete; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.CriteriaUpdate; -import javax.persistence.metamodel.Metamodel; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.core.Context; + +import jakarta.persistence.EntityGraph; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.EntityTransaction; +import jakarta.persistence.FlushModeType; +import jakarta.persistence.LockModeType; +import jakarta.persistence.Query; +import jakarta.persistence.StoredProcedureQuery; +import jakarta.persistence.TypedQuery; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaDelete; +import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.CriteriaUpdate; +import jakarta.persistence.metamodel.Metamodel; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.core.Context; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDataverseCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDataverseCommandTest.java index 7a27625f7b8..9568d58aafb 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDataverseCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDataverseCommandTest.java @@ -25,8 +25,8 @@ import java.util.Date; import java.util.List; import java.util.concurrent.Future; -import javax.persistence.EntityManager; -import javax.servlet.http.HttpServletRequest; +import jakarta.persistence.EntityManager; +import jakarta.servlet.http.HttpServletRequest; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/RequestRsyncScriptCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/RequestRsyncScriptCommandTest.java index 5fdef3ed74c..6eeaa34bf4e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/RequestRsyncScriptCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/RequestRsyncScriptCommandTest.java @@ -9,8 +9,7 @@ import edu.harvard.iq.dataverse.engine.command.DataverseRequest; import edu.harvard.iq.dataverse.mocks.MocksFactory; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; -import static edu.harvard.iq.dataverse.settings.SettingsServiceBean.Key.DataCaptureModuleUrl; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/ReturnDatasetToAuthorCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/ReturnDatasetToAuthorCommandTest.java index a57beb172a6..7f776fb894c 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/ReturnDatasetToAuthorCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/ReturnDatasetToAuthorCommandTest.java @@ -24,9 +24,9 @@ import edu.harvard.iq.dataverse.workflows.WorkflowComment; import java.util.Collections; import java.util.List; -import java.util.concurrent.Future; -import javax.persistence.EntityManager; -import javax.servlet.http.HttpServletRequest; + +import jakarta.persistence.EntityManager; +import jakarta.servlet.http.HttpServletRequest; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/SubmitDatasetForReviewCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/SubmitDatasetForReviewCommandTest.java index e882560c601..f3d59455ac0 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/SubmitDatasetForReviewCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/SubmitDatasetForReviewCommandTest.java @@ -24,9 +24,9 @@ import edu.harvard.iq.dataverse.search.IndexServiceBean; import java.util.Collections; import java.util.List; -import java.util.concurrent.Future; -import javax.persistence.EntityManager; -import javax.servlet.http.HttpServletRequest; + +import jakarta.persistence.EntityManager; +import jakarta.servlet.http.HttpServletRequest; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import org.junit.Before; diff --git a/src/test/java/edu/harvard/iq/dataverse/export/DDIExporterTest.java b/src/test/java/edu/harvard/iq/dataverse/export/DDIExporterTest.java index 306e2aa0928..0eb231dd866 100644 --- a/src/test/java/edu/harvard/iq/dataverse/export/DDIExporterTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/export/DDIExporterTest.java @@ -35,8 +35,8 @@ import java.util.HashSet; import java.util.Set; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonObject; +import jakarta.json.Json; +import jakarta.json.JsonObject; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.BeforeAll; diff --git a/src/test/java/edu/harvard/iq/dataverse/export/OpenAireExporterTest.java b/src/test/java/edu/harvard/iq/dataverse/export/OpenAireExporterTest.java index 43a05c9bd0c..aa1668201ba 100644 --- a/src/test/java/edu/harvard/iq/dataverse/export/OpenAireExporterTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/export/OpenAireExporterTest.java @@ -1,9 +1,6 @@ package edu.harvard.iq.dataverse.export; import com.jayway.restassured.path.xml.XmlPath; -import edu.harvard.iq.dataverse.DatasetVersion; -import edu.harvard.iq.dataverse.authorization.users.PrivateUrlUser; -import edu.harvard.iq.dataverse.privateurl.PrivateUrlServiceBean; import edu.harvard.iq.dataverse.util.xml.XmlPrinter; import io.gdcc.spi.export.ExportDataProvider; import io.gdcc.spi.export.XMLExporter; @@ -17,9 +14,9 @@ import java.io.StringReader; import java.nio.file.Files; import java.nio.file.Paths; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonReader; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.junit.Test; diff --git a/src/test/java/edu/harvard/iq/dataverse/export/SchemaDotOrgExporterTest.java b/src/test/java/edu/harvard/iq/dataverse/export/SchemaDotOrgExporterTest.java index f10aad18496..47333e5c1d9 100644 --- a/src/test/java/edu/harvard/iq/dataverse/export/SchemaDotOrgExporterTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/export/SchemaDotOrgExporterTest.java @@ -3,7 +3,6 @@ import edu.harvard.iq.dataverse.*; import edu.harvard.iq.dataverse.branding.BrandingUtilTest; import io.gdcc.spi.export.ExportDataProvider; -import io.gdcc.spi.export.ExportException; import io.gdcc.spi.export.XMLExporter; import edu.harvard.iq.dataverse.license.License; import edu.harvard.iq.dataverse.license.LicenseServiceBean; @@ -33,7 +32,7 @@ import java.util.List; import java.util.Set; import java.util.logging.Logger; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import edu.harvard.iq.dataverse.util.testing.JvmSetting; import org.junit.jupiter.api.BeforeAll; diff --git a/src/test/java/edu/harvard/iq/dataverse/export/dublincore/DublinCoreExportUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/export/dublincore/DublinCoreExportUtilTest.java index 69c8083734c..4032f4649a4 100644 --- a/src/test/java/edu/harvard/iq/dataverse/export/dublincore/DublinCoreExportUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/export/dublincore/DublinCoreExportUtilTest.java @@ -13,9 +13,9 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonReader; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; import org.junit.jupiter.api.Test; import org.xmlunit.assertj3.XmlAssert; diff --git a/src/test/java/edu/harvard/iq/dataverse/externaltools/ExternalToolHandlerTest.java b/src/test/java/edu/harvard/iq/dataverse/externaltools/ExternalToolHandlerTest.java index ab3a0263d66..39bf96210fc 100644 --- a/src/test/java/edu/harvard/iq/dataverse/externaltools/ExternalToolHandlerTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/externaltools/ExternalToolHandlerTest.java @@ -12,8 +12,8 @@ import edu.harvard.iq.dataverse.util.testing.JvmSetting; import org.junit.jupiter.api.Test; -import javax.json.Json; -import javax.json.JsonObject; +import jakarta.json.Json; +import jakarta.json.JsonObject; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; diff --git a/src/test/java/edu/harvard/iq/dataverse/externaltools/ExternalToolServiceBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/externaltools/ExternalToolServiceBeanTest.java index 7cc28c82cd6..ddcf60bf393 100644 --- a/src/test/java/edu/harvard/iq/dataverse/externaltools/ExternalToolServiceBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/externaltools/ExternalToolServiceBeanTest.java @@ -11,8 +11,8 @@ import edu.harvard.iq.dataverse.authorization.users.ApiToken; import java.util.ArrayList; import java.util.List; -import javax.json.Json; -import javax.json.JsonObjectBuilder; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; diff --git a/src/test/java/edu/harvard/iq/dataverse/externaltools/ExternalToolTest.java b/src/test/java/edu/harvard/iq/dataverse/externaltools/ExternalToolTest.java index bbe029e77e1..e236ab5ff16 100644 --- a/src/test/java/edu/harvard/iq/dataverse/externaltools/ExternalToolTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/externaltools/ExternalToolTest.java @@ -1,6 +1,6 @@ package edu.harvard.iq.dataverse.externaltools; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import static org.junit.Assert.assertEquals; import org.junit.Test; diff --git a/src/test/java/edu/harvard/iq/dataverse/feedback/FeedbackUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/feedback/FeedbackUtilTest.java index 47e0f6da20e..ab624a69dad 100644 --- a/src/test/java/edu/harvard/iq/dataverse/feedback/FeedbackUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/feedback/FeedbackUtilTest.java @@ -5,7 +5,6 @@ import edu.harvard.iq.dataverse.DataFileCategory; import edu.harvard.iq.dataverse.DataFileTag; import edu.harvard.iq.dataverse.Dataset; -import edu.harvard.iq.dataverse.DatasetFieldServiceBean; import edu.harvard.iq.dataverse.DatasetFieldType; import edu.harvard.iq.dataverse.DatasetVersion; import edu.harvard.iq.dataverse.Dataverse; @@ -27,17 +26,14 @@ import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Set; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonReader; -import javax.mail.internet.AddressException; -import javax.mail.internet.InternetAddress; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; +import jakarta.mail.internet.AddressException; +import jakarta.mail.internet.InternetAddress; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; diff --git a/src/test/java/edu/harvard/iq/dataverse/ingest/IngestFrequencyTest.java b/src/test/java/edu/harvard/iq/dataverse/ingest/IngestFrequencyTest.java index cb0655c068f..e9191fab559 100644 --- a/src/test/java/edu/harvard/iq/dataverse/ingest/IngestFrequencyTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/ingest/IngestFrequencyTest.java @@ -8,7 +8,7 @@ import org.junit.Test; -import javax.ejb.EJB; +import jakarta.ejb.EJB; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; diff --git a/src/test/java/edu/harvard/iq/dataverse/ingest/IngestUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/ingest/IngestUtilTest.java index ca68af4090c..b5160a72166 100644 --- a/src/test/java/edu/harvard/iq/dataverse/ingest/IngestUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/ingest/IngestUtilTest.java @@ -17,9 +17,9 @@ import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonArray; -import javax.validation.ConstraintViolation; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.validation.ConstraintViolation; import org.dataverse.unf.UNFUtil; import org.dataverse.unf.UnfException; import org.junit.Test; diff --git a/src/test/java/edu/harvard/iq/dataverse/locality/StorageSiteUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/locality/StorageSiteUtilTest.java index eb9562a2a69..f35296e560b 100644 --- a/src/test/java/edu/harvard/iq/dataverse/locality/StorageSiteUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/locality/StorageSiteUtilTest.java @@ -3,8 +3,8 @@ import edu.harvard.iq.dataverse.util.json.JsonUtil; import java.util.ArrayList; import java.util.List; -import javax.json.Json; -import javax.json.JsonObjectBuilder; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; import org.junit.Test; public class StorageSiteUtilTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/makedatacount/DatasetMetricsServiceBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/makedatacount/DatasetMetricsServiceBeanTest.java index 6fa9ff1a8e9..96569dbee61 100644 --- a/src/test/java/edu/harvard/iq/dataverse/makedatacount/DatasetMetricsServiceBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/makedatacount/DatasetMetricsServiceBeanTest.java @@ -5,9 +5,9 @@ import org.junit.jupiter.api.Test; import org.mockito.Matchers; -import javax.ejb.EJBException; -import javax.persistence.EntityManager; -import javax.persistence.Query; +import jakarta.ejb.EJBException; +import jakarta.persistence.EntityManager; +import jakarta.persistence.Query; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/test/java/edu/harvard/iq/dataverse/makedatacount/MakeDataCountLoggingServiceBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/makedatacount/MakeDataCountLoggingServiceBeanTest.java index a630faf9247..ef30df11e3c 100644 --- a/src/test/java/edu/harvard/iq/dataverse/makedatacount/MakeDataCountLoggingServiceBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/makedatacount/MakeDataCountLoggingServiceBeanTest.java @@ -16,7 +16,7 @@ import edu.harvard.iq.dataverse.makedatacount.MakeDataCountLoggingServiceBean.MakeDataCountEntry; import edu.harvard.iq.dataverse.mocks.MocksFactory; import java.util.Date; -import javax.faces.context.FacesContext; +import jakarta.faces.context.FacesContext; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; import static org.junit.Assert.assertThat; diff --git a/src/test/java/edu/harvard/iq/dataverse/makedatacount/MakeDataCountUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/makedatacount/MakeDataCountUtilTest.java index 4e034f0d314..11664b4e18b 100644 --- a/src/test/java/edu/harvard/iq/dataverse/makedatacount/MakeDataCountUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/makedatacount/MakeDataCountUtilTest.java @@ -4,8 +4,8 @@ import java.io.FileReader; import java.io.IOException; import java.util.List; -import javax.json.Json; -import javax.json.JsonObject; +import jakarta.json.Json; +import jakarta.json.JsonObject; import org.junit.Assert; import org.junit.Test; diff --git a/src/test/java/edu/harvard/iq/dataverse/metrics/MetricsUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/metrics/MetricsUtilTest.java index 9aa4c9c6723..41aa2dfb5f3 100644 --- a/src/test/java/edu/harvard/iq/dataverse/metrics/MetricsUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/metrics/MetricsUtilTest.java @@ -8,10 +8,10 @@ import java.util.List; import java.util.Arrays; import java.util.Collection; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObject; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; diff --git a/src/test/java/edu/harvard/iq/dataverse/mocks/MockDatasetFieldSvc.java b/src/test/java/edu/harvard/iq/dataverse/mocks/MockDatasetFieldSvc.java index a8177537d5f..22936def497 100644 --- a/src/test/java/edu/harvard/iq/dataverse/mocks/MockDatasetFieldSvc.java +++ b/src/test/java/edu/harvard/iq/dataverse/mocks/MockDatasetFieldSvc.java @@ -3,7 +3,7 @@ import java.util.HashMap; import java.util.Map; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import edu.harvard.iq.dataverse.ControlledVocabularyValue; import edu.harvard.iq.dataverse.DatasetFieldServiceBean; diff --git a/src/test/java/edu/harvard/iq/dataverse/passwordreset/PasswordResetServiceBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/passwordreset/PasswordResetServiceBeanTest.java index d7da02e4459..e812ca11025 100644 --- a/src/test/java/edu/harvard/iq/dataverse/passwordreset/PasswordResetServiceBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/passwordreset/PasswordResetServiceBeanTest.java @@ -12,8 +12,8 @@ import org.mockito.ArgumentMatchers; import org.mockito.Matchers; -import javax.persistence.EntityManager; -import javax.persistence.TypedQuery; +import jakarta.persistence.EntityManager; +import jakarta.persistence.TypedQuery; import java.util.Arrays; import java.util.List; diff --git a/src/test/java/edu/harvard/iq/dataverse/pidproviders/PidUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/pidproviders/PidUtilTest.java index cbab8745a9b..3a35303d7bb 100644 --- a/src/test/java/edu/harvard/iq/dataverse/pidproviders/PidUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/pidproviders/PidUtilTest.java @@ -1,7 +1,6 @@ package edu.harvard.iq.dataverse.pidproviders; import edu.harvard.iq.dataverse.DOIServiceBean; -import edu.harvard.iq.dataverse.DataFileCategoryServiceBean; import edu.harvard.iq.dataverse.GlobalId; import edu.harvard.iq.dataverse.GlobalIdServiceBean; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; @@ -10,8 +9,8 @@ import java.util.ArrayList; import java.util.List; -import javax.json.JsonObjectBuilder; -import javax.ws.rs.NotFoundException; +import jakarta.json.JsonObjectBuilder; +import jakarta.ws.rs.NotFoundException; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; diff --git a/src/test/java/edu/harvard/iq/dataverse/repositorystorageabstractionlayer/RepositoryStorageAbstractionLayerUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/repositorystorageabstractionlayer/RepositoryStorageAbstractionLayerUtilTest.java index d09c6eee8dc..b45da0f68f8 100644 --- a/src/test/java/edu/harvard/iq/dataverse/repositorystorageabstractionlayer/RepositoryStorageAbstractionLayerUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/repositorystorageabstractionlayer/RepositoryStorageAbstractionLayerUtilTest.java @@ -4,8 +4,8 @@ import edu.harvard.iq.dataverse.locality.StorageSite; import java.util.ArrayList; import java.util.List; -import javax.json.JsonArray; -import javax.json.JsonObject; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; import static org.junit.Assert.assertEquals; import org.junit.Test; diff --git a/src/test/java/edu/harvard/iq/dataverse/search/SolrSearchResultTest.java b/src/test/java/edu/harvard/iq/dataverse/search/SolrSearchResultTest.java index 8def87cee5a..e85084f96ab 100644 --- a/src/test/java/edu/harvard/iq/dataverse/search/SolrSearchResultTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/search/SolrSearchResultTest.java @@ -1,8 +1,8 @@ package edu.harvard.iq.dataverse.search; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; diff --git a/src/test/java/edu/harvard/iq/dataverse/util/MockResponse.java b/src/test/java/edu/harvard/iq/dataverse/util/MockResponse.java index 0584c6161f1..8d5b4940c14 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/MockResponse.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/MockResponse.java @@ -7,14 +7,14 @@ import java.util.Map; import java.util.Set; import static java.util.stream.Collectors.toList; -import javax.ws.rs.core.EntityTag; -import javax.ws.rs.core.GenericType; -import javax.ws.rs.core.Link; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedHashMap; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.core.NewCookie; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.core.EntityTag; +import jakarta.ws.rs.core.GenericType; +import jakarta.ws.rs.core.Link; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedHashMap; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.core.NewCookie; +import jakarta.ws.rs.core.Response; /** * Simple mock class for HTTP response. This is needed as the normal response builders diff --git a/src/test/java/edu/harvard/iq/dataverse/util/PersonOrOrgUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/util/PersonOrOrgUtilTest.java index 0e2fc1596c9..f86be18cf3a 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/PersonOrOrgUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/PersonOrOrgUtilTest.java @@ -6,7 +6,7 @@ import org.junit.Test; import static org.junit.Assert.*; -import javax.json.JsonObject; +import jakarta.json.JsonObject; public class PersonOrOrgUtilTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/util/json/BriefJsonPrinterTest.java b/src/test/java/edu/harvard/iq/dataverse/util/json/BriefJsonPrinterTest.java index dc36b197c55..b426f84a464 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/json/BriefJsonPrinterTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/json/BriefJsonPrinterTest.java @@ -6,15 +6,14 @@ import edu.harvard.iq.dataverse.DatasetFieldType; import edu.harvard.iq.dataverse.DatasetVersion; import edu.harvard.iq.dataverse.MetadataBlock; -import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinUser; import edu.harvard.iq.dataverse.mocks.MocksFactory; import edu.harvard.iq.dataverse.workflow.Workflow; -import javax.json.JsonObject; -import org.junit.Test; +import jakarta.json.JsonObject; +import org.junit.jupiter.api.Test; import java.util.Collections; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonParserTest.java b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonParserTest.java index 579711d63c3..2339d3bf6a7 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonParserTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonParserTest.java @@ -33,13 +33,13 @@ import org.junit.Test; import org.mockito.Mockito; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.JsonReader; -import javax.json.JsonValue; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonReader; +import jakarta.json.JsonValue; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; diff --git a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonPrinterTest.java b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonPrinterTest.java index 8697b5aa354..378158f6ff0 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonPrinterTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonPrinterTest.java @@ -19,10 +19,10 @@ import java.util.List; import java.util.Set; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.JsonString; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonString; import edu.harvard.iq.dataverse.util.BundleUtil; import org.junit.Test; diff --git a/src/test/java/edu/harvard/iq/dataverse/validation/EMailValidatorTest.java b/src/test/java/edu/harvard/iq/dataverse/validation/EMailValidatorTest.java index 80d848248c0..0cbc9e52759 100644 --- a/src/test/java/edu/harvard/iq/dataverse/validation/EMailValidatorTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/validation/EMailValidatorTest.java @@ -4,9 +4,9 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; import java.util.Set; import java.util.stream.Stream; diff --git a/src/test/java/edu/harvard/iq/dataverse/validation/URLValidatorTest.java b/src/test/java/edu/harvard/iq/dataverse/validation/URLValidatorTest.java index 3fe8501bbbf..8c29b609c9b 100644 --- a/src/test/java/edu/harvard/iq/dataverse/validation/URLValidatorTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/validation/URLValidatorTest.java @@ -1,8 +1,8 @@ package edu.harvard.iq.dataverse.validation; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; diff --git a/src/test/java/edu/harvard/iq/dataverse/validation/UserNameValidatorTest.java b/src/test/java/edu/harvard/iq/dataverse/validation/UserNameValidatorTest.java index a9816f81dca..1e5f0ca0371 100644 --- a/src/test/java/edu/harvard/iq/dataverse/validation/UserNameValidatorTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/validation/UserNameValidatorTest.java @@ -7,9 +7,9 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; import static org.junit.jupiter.api.Assertions.assertEquals; From 27d846747577b71ca10dcc359a9dffa2bbb42f0a Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Wed, 23 Mar 2022 16:18:06 +0100 Subject: [PATCH 004/173] build!(deps): switch to Primefaces 11 Jakarta Edition #8305 --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 96f598af0f5..df11dfe8b54 100644 --- a/pom.xml +++ b/pom.xml @@ -203,6 +203,7 @@ org.primefaces primefaces 11.0.0 + jakarta org.primefaces.themes From a1dc896d67c973698c3536f6fd6f763b7c0db549 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Thu, 24 Mar 2022 14:56:14 +0100 Subject: [PATCH 005/173] build(api): align Jersey deps with BOMs #8305 1. The Jersey dependencies in use did not use the versions imported via the Payara BOM (which itself imports a Jersey BOM). 2. The coordinates for the server package changed, re-aligned. --- pom.xml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index df11dfe8b54..4f385274679 100644 --- a/pom.xml +++ b/pom.xml @@ -416,15 +416,13 @@ - org.glassfish.jersey.containers - jersey-container-servlet - 2.23.2 + org.glassfish.jersey.core + jersey-server org.glassfish.jersey.media jersey-media-multipart - 2.23.2 com.mashape.unirest From cbbb5615d072858eab175ed6786364f17adf18cb Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Fri, 25 Mar 2022 10:51:04 +0100 Subject: [PATCH 006/173] refactor(webapp): migrate web.xml to Jakarta Faces #8305 --- src/main/webapp/WEB-INF/web.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 8179ca970d5..1867c0b92e1 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -27,7 +27,7 @@ See also dev guide: https://guides.dataverse.org/en/latest/developers/debugging.html --> - javax.faces.PROJECT_STAGE + jakarta.faces.PROJECT_STAGE ${MPCONFIG=dataverse.jsf.project-stage:Production} @@ -43,23 +43,23 @@ - javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL + jakarta.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL ${MPCONFIG=dataverse.jsf.empty-string-null:true} - javax.faces.FACELETS_SKIP_COMMENTS + jakarta.faces.FACELETS_SKIP_COMMENTS ${MPCONFIG=dataverse.jsf.skip-comments:true} - javax.faces.FACELETS_BUFFER_SIZE + jakarta.faces.FACELETS_BUFFER_SIZE ${MPCONFIG=dataverse.jsf.buffer-size:102400} - javax.faces.FACELETS_REFRESH_PERIOD + jakarta.faces.FACELETS_REFRESH_PERIOD ${MPCONFIG=dataverse.jsf.refresh-period:-1} @@ -86,7 +86,7 @@ Faces Servlet - javax.faces.webapp.FacesServlet + jakarta.faces.webapp.FacesServlet 1 From c2c75d8900ba1263b7761c9f8d87c9f420a7955f Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Fri, 25 Mar 2022 11:05:45 +0100 Subject: [PATCH 007/173] docs: fix Jakarta occurences in code comments #8305 --- .../edu/harvard/iq/dataverse/DataverseRoleServiceBean.java | 2 +- .../harvard/iq/dataverse/api/DatasetFieldServiceApi.java | 2 +- .../iq/dataverse/datavariable/VariableServiceBean.java | 6 +++--- .../iq/dataverse/ingest/IngestServiceShapefileHelper.java | 2 +- .../edu/harvard/iq/dataverse/util/DataSourceProducer.java | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseRoleServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DataverseRoleServiceBean.java index 2d9a26a01c8..78d5eaf3414 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseRoleServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseRoleServiceBean.java @@ -23,7 +23,7 @@ import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import jakarta.persistence.TypedQuery; -//import javax.validation.constraints.NotNull; +//import jakarta.validation.constraints.NotNull; /** * diff --git a/src/main/java/edu/harvard/iq/dataverse/api/DatasetFieldServiceApi.java b/src/main/java/edu/harvard/iq/dataverse/api/DatasetFieldServiceApi.java index 62babf3ae34..ef7b3a2f45c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/DatasetFieldServiceApi.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/DatasetFieldServiceApi.java @@ -207,7 +207,7 @@ public Response showControlledVocabularyForSubject() { @GET @Path("loadNAControlledVocabularyValue") public Response loadNAControlledVocabularyValue() { - // the find will throw a javax.persistence.NoResultException if no values are in db + // the find will throw a jakarta.persistence.NoResultException if no values are in db // datasetFieldService.findNAControlledVocabularyValue(); TypedQuery naValueFinder = em.createQuery("SELECT OBJECT(o) FROM ControlledVocabularyValue AS o WHERE o.datasetFieldType is null AND o.strValue = :strvalue", ControlledVocabularyValue.class); naValueFinder.setParameter("strvalue", DatasetField.NA_VALUE); diff --git a/src/main/java/edu/harvard/iq/dataverse/datavariable/VariableServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/datavariable/VariableServiceBean.java index 4636b126e0a..9fb4a3fd34c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/datavariable/VariableServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/datavariable/VariableServiceBean.java @@ -105,7 +105,7 @@ public VariableFormatType findVariableFormatTypeByName(String name) { VariableFormatType type = null; try { type = (VariableFormatType)query.getSingleResult(); - } catch (javax.persistence.NoResultException e) { + } catch (jakarta.persistence.NoResultException e) { // DO nothing, just return null. } return type; @@ -116,7 +116,7 @@ public VariableIntervalType findVariableIntervalTypeByName(String name) { VariableIntervalType type = null; try { type=(VariableIntervalType)em.createQuery(query).getSingleResult(); - } catch (javax.persistence.NoResultException e) { + } catch (jakarta.persistence.NoResultException e) { // DO nothing, just return null. } return type; @@ -127,7 +127,7 @@ public SummaryStatisticType findSummaryStatisticTypeByName(String name) { SummaryStatisticType type = null; try { type = (SummaryStatisticType) em.createQuery(query).getSingleResult(); - } catch (javax.persistence.NoResultException e) { + } catch (jakarta.persistence.NoResultException e) { // DO nothing, just return null. } return type; diff --git a/src/main/java/edu/harvard/iq/dataverse/ingest/IngestServiceShapefileHelper.java b/src/main/java/edu/harvard/iq/dataverse/ingest/IngestServiceShapefileHelper.java index 9ea2cd0343f..8c5dad237b1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ingest/IngestServiceShapefileHelper.java +++ b/src/main/java/edu/harvard/iq/dataverse/ingest/IngestServiceShapefileHelper.java @@ -16,7 +16,7 @@ import java.io.IOException; import java.util.List; import java.util.logging.Logger; -//import javax.ejb.EJB; +//import jakarta.ejb.EJB; /** * Used by the IngestServiceBean to redistribute a zipped Shapefile* diff --git a/src/main/java/edu/harvard/iq/dataverse/util/DataSourceProducer.java b/src/main/java/edu/harvard/iq/dataverse/util/DataSourceProducer.java index c6994397a9c..62cd318706f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/DataSourceProducer.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/DataSourceProducer.java @@ -6,7 +6,7 @@ import jakarta.inject.Singleton; import javax.sql.DataSource; -// Find docs here: https://javaee.github.io/javaee-spec/javadocs/javax/annotation/sql/DataSourceDefinition.html +// Find docs here: https://jakarta.ee/specifications/annotations/2.1/apidocs/jakarta.annotation/jakarta/annotation/sql/datasourcedefinition @Singleton @DataSourceDefinition( name = "java:app/jdbc/dataverse", From 83b0ff45b72b14da53c75f4a2d511013ea8f5548 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Fri, 25 Mar 2022 11:06:25 +0100 Subject: [PATCH 008/173] fix(ingest): migrate JMS interface class string to Jakarta #8305 --- .../edu/harvard/iq/dataverse/ingest/IngestMessageBean.java | 2 +- .../edu/harvard/iq/dataverse/ingest/IngestQueueProducer.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/ingest/IngestMessageBean.java b/src/main/java/edu/harvard/iq/dataverse/ingest/IngestMessageBean.java index eef325fe4ec..f56fe608a52 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ingest/IngestMessageBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/ingest/IngestMessageBean.java @@ -49,7 +49,7 @@ mappedName = "java:app/jms/queue/ingest", activationConfig = { @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"), - @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") + @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "jakarta.jms.Queue") } ) diff --git a/src/main/java/edu/harvard/iq/dataverse/ingest/IngestQueueProducer.java b/src/main/java/edu/harvard/iq/dataverse/ingest/IngestQueueProducer.java index 39283adea49..0fed25e5c88 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ingest/IngestQueueProducer.java +++ b/src/main/java/edu/harvard/iq/dataverse/ingest/IngestQueueProducer.java @@ -13,7 +13,7 @@ description = "Dataverse Ingest Queue Factory", name = "java:app/jms/factory/ingest", resourceAdapter = "jmsra", - interfaceName = "javax.jms.QueueConnectionFactory", + interfaceName = "jakarta.jms.QueueConnectionFactory", maxPoolSize = 250, minPoolSize = 1, properties = { @@ -25,7 +25,7 @@ description = "Dataverse Ingest Queue", name = "java:app/jms/queue/ingest", resourceAdapter = "jmsra", - interfaceName="javax.jms.Queue", + interfaceName="jakarta.jms.Queue", destinationName = "DataverseIngest" ) @Singleton From b74f5d0249f1e772c52e2f6a71491b79bfc36c93 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Fri, 25 Mar 2022 11:08:22 +0100 Subject: [PATCH 009/173] refactor(api): make Index API check on most specific exception type only #8305 This avoids potential trouble were it's unclear from where the higher exceptions come from, javax or jakarta namespace. --- src/main/java/edu/harvard/iq/dataverse/api/Index.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Index.java b/src/main/java/edu/harvard/iq/dataverse/api/Index.java index 1f03d91b324..4910c460b6a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Index.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Index.java @@ -197,7 +197,7 @@ private Response indexAllOrSubset(Long numPartitionsSelected, Long partitionIdTo } } } - if (sb.toString().equals("javax.ejb.EJBException: Transaction aborted javax.transaction.RollbackException java.lang.IllegalStateException ")) { + if (sb.toString().contains("java.lang.IllegalStateException ")) { return ok("indexing went as well as can be expected... got java.lang.IllegalStateException but some indexing may have happened anyway"); } else { return error(Status.INTERNAL_SERVER_ERROR, sb.toString()); From ddda066d093ba84bb20d4de1945ac496d4846a34 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Fri, 25 Mar 2022 11:09:01 +0100 Subject: [PATCH 010/173] style(webapp): switch URL path to Jakarta Faces #8305 --- src/main/webapp/resources/css/structure.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/webapp/resources/css/structure.css b/src/main/webapp/resources/css/structure.css index 2435663de50..3247da243fd 100644 --- a/src/main/webapp/resources/css/structure.css +++ b/src/main/webapp/resources/css/structure.css @@ -67,7 +67,7 @@ tr.ui-state-highlight, .ui-widget-content tr.ui-state-highlight, .ui-widget-head tr.ui-state-highlight label, .ui-widget-content tr.ui-state-highlight label, .ui-widget-header tr.ui-state-highlight label {color: #333333;} tr.ui-state-highlight a:not(.btn), .ui-widget-content tr.ui-state-highlight a:not(.btn), .ui-widget-header tr.ui-state-highlight a:not(.btn) {color: #428bca;} tr.ui-state-highlight .ui-icon { - background-image: url("/javax.faces.resource/images/ui-icons_333333_256x240.png.xhtml?ln=primefaces-bootstrap"); + background-image: url("/jakarta.faces.resource/images/ui-icons_333333_256x240.png.xhtml?ln=primefaces-bootstrap"); } td.col-select-width, th.col-select-width {width:36px;} From 34a421b77edab63072e43b66a3e7c2cff8cd8fbd Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Fri, 25 Mar 2022 11:10:49 +0100 Subject: [PATCH 011/173] fix(webapp): remove deleted Primefaces PushServlet from web.xml #8305 https://stackoverflow.com/questions/52737981/rebuilding-primefaces-jar-file-missing-pushservlet --- src/main/webapp/WEB-INF/web.xml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 1867c0b92e1..dced5893908 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -89,11 +89,6 @@ jakarta.faces.webapp.FacesServlet 1 - - Push Servlet - org.primefaces.push.PushServlet - true - OAIServlet @@ -128,10 +123,6 @@ Faces Servlet *.xhtml - - Push Servlet - /primepush/* - OAIServlet /oai From 6bc0330d9acbeb629a7097787ff5b67c5b62f8c9 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Fri, 25 Mar 2022 15:12:01 +0100 Subject: [PATCH 012/173] chore(persistence): migrate persistence.xml to Jakarta EE 10 #8305 Also add provided dependency of our persistence provider to POM to allow class resolution in IDEs. --- pom.xml | 6 ++++++ src/main/resources/META-INF/persistence.xml | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 4f385274679..ed512e8ec71 100644 --- a/pom.xml +++ b/pom.xml @@ -160,6 +160,12 @@ flyway-core ${flyway.version} + + + org.eclipse.persistence + org.eclipse.persistence.jpa + provided + com.google.guava guava diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml index 45552f36939..e6224dcdf01 100644 --- a/src/main/resources/META-INF/persistence.xml +++ b/src/main/resources/META-INF/persistence.xml @@ -1,11 +1,11 @@ - + - org.eclipse.persistence.jpa.PersistenceProvider java:app/jdbc/dataverse - From 59d38a6265ced931e9236756258e2b679036867d Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Wed, 28 Jun 2023 19:26:10 +0200 Subject: [PATCH 014/173] chore(build): update to Payara 6.2023.6 #8305 --- modules/dataverse-parent/pom.xml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/modules/dataverse-parent/pom.xml b/modules/dataverse-parent/pom.xml index 7d46f7c49b9..7cf9c8092ed 100644 --- a/modules/dataverse-parent/pom.xml +++ b/modules/dataverse-parent/pom.xml @@ -148,7 +148,7 @@ -Duser.timezone=${project.timezone} -Dfile.encoding=${project.build.sourceEncoding} -Duser.language=${project.language} -Duser.region=${project.region} - 5.2022.3 + 6.2023.6 42.5.1 8.11.1 1.12.290 @@ -393,11 +393,9 @@ ct - 5.2022.5 + From 56f8ad2655b9de56fa6c6bf5f4a3f0e358649749 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Wed, 20 Jul 2022 19:47:30 +0200 Subject: [PATCH 015/173] chore(deps): migrate to Jakarta EE 10 dependencies #8305 Many projects have moved to Eclipse foundation, have been replaced or renamed with the move to Jakarta EE 10. With the import of the new EE 10 Payara BOM, we need to follow their changes (or provide the deps on our own). --- pom.xml | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index ed512e8ec71..25b4fd776fc 100644 --- a/pom.xml +++ b/pom.xml @@ -96,7 +96,7 @@ io.gdcc sword2-server - 1.2.1 + 2.0.0-SNAPSHOT @@ -172,6 +172,8 @@ 29.0-jre jar + + org.eclipse.microprofile.config microprofile-config-api @@ -180,13 +182,14 @@ jakarta.platform jakarta.jakartaee-api - ${jakartaee-api.version} provided - + + + - org.glassfish - jakarta.json + org.eclipse.angus + angus-activation provided @@ -195,11 +198,16 @@ payara-api provided + + + - com.sun.mail - jakarta.mail + org.eclipse.parsson + jakarta.json provided + + org.glassfish jakarta.faces @@ -219,9 +227,10 @@ org.omnifaces omnifaces - 3.8 + 4.0-M13 + jakarta.validation jakarta.validation-api @@ -232,9 +241,12 @@ hibernate-validator provided + + + - org.glassfish - jakarta.el + org.glassfish.expressly + expressly provided @@ -401,7 +413,7 @@ oauth2-oidc-sdk 10.7.1 - + io.gdcc xoai-data-provider From 8c5fb1eb4b323408ad4607d5aa0dae0b01e7ff0f Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Wed, 28 Jun 2023 19:43:36 +0200 Subject: [PATCH 016/173] chore!(spi): update SPI module to version 2.0.0 #8305 As the SPI module used Java EE, we need to release a v2, as the move to Jakarta EE is a breaking change. --- modules/dataverse-spi/pom.xml | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/dataverse-spi/pom.xml b/modules/dataverse-spi/pom.xml index 6235d309e89..b00053fe5e0 100644 --- a/modules/dataverse-spi/pom.xml +++ b/modules/dataverse-spi/pom.xml @@ -13,7 +13,7 @@ io.gdcc dataverse-spi - 1.0.0${project.version.suffix} + 2.0.0${project.version.suffix} jar Dataverse SPI Plugin API diff --git a/pom.xml b/pom.xml index 25b4fd776fc..14a3ffc0e3e 100644 --- a/pom.xml +++ b/pom.xml @@ -530,7 +530,7 @@ io.gdcc dataverse-spi - 1.0.0 + 2.0.0 From a4a6d230d6593d9cf20d1b0684622455a1fa7359 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Wed, 28 Jun 2023 19:56:30 +0200 Subject: [PATCH 017/173] build(deps): update to Jakartafied JSON-LD library version #8305 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 14a3ffc0e3e..74f3f672676 100644 --- a/pom.xml +++ b/pom.xml @@ -119,7 +119,7 @@ com.apicatalog titanium-json-ld - 1.3.0-SNAPSHOT + 1.3.2 com.google.code.gson From e694643b0de9b4bef97639fd2bfe9a9329acf54d Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Wed, 27 Jul 2022 14:54:05 +0200 Subject: [PATCH 018/173] fix(deps): remove usages of PrettyFaces String utils Removing some rogue usages of OcpSoft PrettyFaces internal utils for String care and replacing with either Apache Commons Lang3 or native JVM code. --- .../edu/harvard/iq/dataverse/DatasetServiceBean.java | 10 +++++----- .../edu/harvard/iq/dataverse/DvObjectServiceBean.java | 3 +-- .../java/edu/harvard/iq/dataverse/UserServiceBean.java | 3 +-- .../dataverse/datasetutility/AddReplaceFileHelper.java | 3 +-- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DatasetServiceBean.java index d8c518e61b1..e8d9598f403 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetServiceBean.java @@ -44,7 +44,7 @@ import jakarta.persistence.Query; import jakarta.persistence.StoredProcedureQuery; import jakarta.persistence.TypedQuery; -import org.ocpsoft.common.util.Strings; +import org.apache.commons.lang3.StringUtils; /** * @@ -117,7 +117,7 @@ public Dataset find(Object pk) { public Dataset findDeep(Object pk) { return (Dataset) em.createNamedQuery("Dataset.findById") .setParameter("id", pk) - // Optimization hints: retrieve all data in one query; this prevents point queries when iterating over the files + // Optimization hints: retrieve all data in one query; this prevents point queries when iterating over the files .setHint("eclipselink.left-join-fetch", "o.files.ingestRequest") .setHint("eclipselink.left-join-fetch", "o.files.thumbnailForDataset") .setHint("eclipselink.left-join-fetch", "o.files.dataTables") @@ -591,7 +591,7 @@ public Map getArchiveDescriptionsForHarvestedDatasets(Set da return null; } - String datasetIdStr = Strings.join(datasetIds, ", "); + String datasetIdStr = StringUtils.join(datasetIds, ", "); String qstr = "SELECT d.id, h.archiveDescription FROM harvestingClient h, dataset d WHERE d.harvestingClient_id = h.id AND d.id IN (" + datasetIdStr + ")"; List searchResults; @@ -767,11 +767,11 @@ public void reExportDatasetAsync(Dataset dataset) { public void exportDataset(Dataset dataset, boolean forceReExport) { if (dataset != null) { - // Note that the logic for handling a dataset is similar to what is implemented in exportAllDatasets, + // Note that the logic for handling a dataset is similar to what is implemented in exportAllDatasets, // but when only one dataset is exported we do not log in a separate export logging file if (dataset.isReleased() && dataset.getReleasedVersion() != null && !dataset.isDeaccessioned()) { - // can't trust dataset.getPublicationDate(), no. + // can't trust dataset.getPublicationDate(), no. Date publicationDate = dataset.getReleasedVersion().getReleaseTime(); // we know this dataset has a non-null released version! Maybe not - SEK 8/19 (We do now! :) if (forceReExport || (publicationDate != null && (dataset.getLastExportTime() == null diff --git a/src/main/java/edu/harvard/iq/dataverse/DvObjectServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DvObjectServiceBean.java index 82af3d4bfe1..9d6ccd8a69d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DvObjectServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DvObjectServiceBean.java @@ -24,7 +24,6 @@ import jakarta.persistence.StoredProcedureQuery; import org.apache.commons.lang3.StringUtils; -import org.ocpsoft.common.util.Strings; /** * Your goto bean for everything {@link DvObject}, that's not tied to any @@ -319,7 +318,7 @@ public Map getObjectPathsByIds(Set objectIds){ return null; } - String datasetIdStr = Strings.join(objectIds, ", "); + String datasetIdStr = StringUtils.join(objectIds, ", "); String qstr = "WITH RECURSIVE path_elements AS ((" + " SELECT id, owner_id FROM dvobject WHERE id in (" + datasetIdStr + "))" + diff --git a/src/main/java/edu/harvard/iq/dataverse/UserServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/UserServiceBean.java index 56633a34339..93892376edc 100644 --- a/src/main/java/edu/harvard/iq/dataverse/UserServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/UserServiceBean.java @@ -21,7 +21,6 @@ import jakarta.persistence.PersistenceContext; import jakarta.persistence.Query; import org.apache.commons.lang3.StringUtils; -import org.ocpsoft.common.util.Strings; @Stateless @Named @@ -190,7 +189,7 @@ private HashMap> retrieveRolesForUsers(List userO // Add '@' to each identifier and delimit the list by "," // ------------------------------------------------- String identifierListString = userIdentifierList.stream() - .filter(x -> !Strings.isNullOrEmpty(x)) + .filter(x -> x != null && !x.isEmpty()) .map(x -> "'@" + x + "'") .collect(Collectors.joining(", ")); diff --git a/src/main/java/edu/harvard/iq/dataverse/datasetutility/AddReplaceFileHelper.java b/src/main/java/edu/harvard/iq/dataverse/datasetutility/AddReplaceFileHelper.java index e587160bdef..98d5afc47e6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/datasetutility/AddReplaceFileHelper.java +++ b/src/main/java/edu/harvard/iq/dataverse/datasetutility/AddReplaceFileHelper.java @@ -61,7 +61,6 @@ import edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder; import org.apache.commons.io.IOUtils; -import org.ocpsoft.common.util.Strings; import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; @@ -1216,7 +1215,7 @@ private boolean step_030_createNewFilesViaIngest(){ initialFileList = result.getDataFiles(); } catch (IOException ex) { - if (!Strings.isNullOrEmpty(ex.getMessage())) { + if (ex.getMessage() != null && !ex.getMessage().isEmpty()) { this.addErrorSevere(getBundleErr("ingest_create_file_err") + " " + ex.getMessage()); } else { this.addErrorSevere(getBundleErr("ingest_create_file_err")); From 65a4c127405ae3ea864f31467cb60e7d1222769f Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Wed, 2 Nov 2022 09:46:57 +0100 Subject: [PATCH 019/173] build(deps): add second Maven Central snapshot repo and enable both #8305 Any users registered before 2021 release to oss.sonatype.org. As gdcc was installed after that, we only had s01.oss.sonatype.org. Also enabling both snapshot repos for Rewrite and SWORD2 See also https://central.sonatype.org/news/20210223_new-users-on-s01 --- modules/dataverse-parent/pom.xml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/modules/dataverse-parent/pom.xml b/modules/dataverse-parent/pom.xml index 7cf9c8092ed..5f1fbea87ec 100644 --- a/modules/dataverse-parent/pom.xml +++ b/modules/dataverse-parent/pom.xml @@ -374,10 +374,20 @@ Local repository for hosting jars not available from network repositories. file://${project.basedir}/local_lib - oss-sonatype oss-sonatype + + https://oss.sonatype.org/content/repositories/snapshots/ + + + true + + + + s01-oss-sonatype + s01-oss-sonatype https://s01.oss.sonatype.org/content/repositories/snapshots/ @@ -385,7 +395,7 @@ true - --> + From f6772d28fb86c232a190255f3fadf2b517952149 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Wed, 28 Jun 2023 20:28:38 +0200 Subject: [PATCH 020/173] build(deps): switch to Prettyfaces 6.0 snapshots for Jakarta EE 10 support #8305 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 74f3f672676..021077c4989 100644 --- a/pom.xml +++ b/pom.xml @@ -362,12 +362,12 @@ org.ocpsoft.rewrite rewrite-servlet - 3.5.0.Final + 6.0.0-SNAPSHOT org.ocpsoft.rewrite rewrite-config-prettyfaces - 3.5.0.Final + 6.0.0-SNAPSHOT edu.ucsb.nceas From 610c8fddebbb775f160f514fa59aa77e20787156 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Thu, 24 Mar 2022 14:43:28 +0100 Subject: [PATCH 021/173] build(sword): switch to Jakarta-enabled SWORD2 preview release #8305 --- .../api/datadeposit/CollectionDepositManagerImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/CollectionDepositManagerImpl.java b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/CollectionDepositManagerImpl.java index c306ba2fec2..5bc50903be8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/CollectionDepositManagerImpl.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/CollectionDepositManagerImpl.java @@ -174,7 +174,9 @@ public DepositReceipt createNew(String collectionUri, Deposit deposit, AuthCrede // curl --insecure --data-binary "@multipart.dat" -H 'Content-Type: multipart/related; boundary="===============0670350989=="' -H "MIME-Version: 1.0" https://sword:sword@localhost:8181/dvn/api/data-deposit/v1/swordv2/collection/dataverse/sword/hdl:1902.1/12345 // but... // "Yeah, multipart is critically broken across all implementations" -- http://www.mail-archive.com/sword-app-tech@lists.sourceforge.net/msg00327.html - throw new UnsupportedOperationException("Not yet implemented"); + // + // OB 2022-03-24 -> sword2-server v2.0 library drops support for multipart/related. + throw new SwordError(UriRegistry.ERROR_BAD_REQUEST, "Multipart/related RFC2387 type posts are not supported. Please POST an Atom entry instead."); } else { throw new SwordError(UriRegistry.ERROR_BAD_REQUEST, "expected deposit types are isEntryOnly, isBinaryOnly, and isMultiPart"); } From 89182c1de0335a7a72079ee773504ca9d006f4aa Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Fri, 27 May 2022 16:24:48 -0400 Subject: [PATCH 022/173] fix(sword): as of Payara 6, "attachment; " required to upload files #8305 This is due to the fact that Payara 6 Servlets are more strict in their parsing of HTTP headers. --- doc/release-notes/8305-payara6.md | 3 +++ doc/sphinx-guides/source/api/sword.rst | 6 +++++- .../api/datadeposit/SWORDv2MediaResourceServlet.java | 4 ++++ src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java | 4 ++-- 4 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 doc/release-notes/8305-payara6.md diff --git a/doc/release-notes/8305-payara6.md b/doc/release-notes/8305-payara6.md new file mode 100644 index 00000000000..9e197f07e98 --- /dev/null +++ b/doc/release-notes/8305-payara6.md @@ -0,0 +1,3 @@ +## Backward Incompatible Changes + +- To upload files, the SWORD API now requires "Content-Disposition: attachment; filename=example.zip" rather than "Content-Disposition: filename=example.zip". diff --git a/doc/sphinx-guides/source/api/sword.rst b/doc/sphinx-guides/source/api/sword.rst index 11b43e98774..7be1f3ffc16 100755 --- a/doc/sphinx-guides/source/api/sword.rst +++ b/doc/sphinx-guides/source/api/sword.rst @@ -67,6 +67,8 @@ Differences in Dataverse Software 4 from DVN 3.x lead to a few minor backward in - As of Dataverse Software 5.10, ``NONE`` is no longer supported as a license. +- As of Dataverse Software 6.0, when uploading files, you must supply "Content-Disposition: attachment; filename=example.zip" rather than "Content-Disposition: filename=example.zip". See :ref:`sword-add-files`. + New features as of v1.1 ----------------------- @@ -161,6 +163,8 @@ You must have permission to add datasets in a Dataverse collection (the Datavers curl -u $API_TOKEN: https://$HOSTNAME/dvn/api/data-deposit/v1.1/swordv2/collection/dataverse/$DATAVERSE_ALIAS +.. _sword-add-files: + Add files to a dataset with a zip file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -168,7 +172,7 @@ You must have ``EditDataset`` permission (Contributor role or above such as Cura .. code-block:: bash - curl -u $API_TOKEN: --data-binary @path/to/example.zip -H "Content-Disposition: filename=example.zip" -H "Content-Type: application/zip" -H "Packaging: http://purl.org/net/sword/package/SimpleZip" https://$HOSTNAME/dvn/api/data-deposit/v1.1/swordv2/edit-media/study/doi:TEST/12345 + curl -u $API_TOKEN: --data-binary @path/to/example.zip -H "Content-Disposition: attachment; filename=example.zip" -H "Content-Type: application/zip" -H "Packaging: http://purl.org/net/sword/package/SimpleZip" https://$HOSTNAME/dvn/api/data-deposit/v1.1/swordv2/edit-media/study/doi:TEST/12345 Display a dataset atom entry ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SWORDv2MediaResourceServlet.java b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SWORDv2MediaResourceServlet.java index 245ab6ab23b..0cea1b80571 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SWORDv2MediaResourceServlet.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SWORDv2MediaResourceServlet.java @@ -61,6 +61,10 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S try { lock.lock(); mediaResourceManagerImpl.setHttpRequest(req); + // Under Payara 5 we could send "Content-Disposition: filename=example.zip" + // Under Payara 6 now must send "Content-Disposition: attachment; filename=example.zip" + // Otherwise we get "Filename could not be extracted from Content-Disposition: Expected separator ';' instead of '='" + // Use req.getHeader("Content-Disposition") to see what the client is sending. this.api.post(req, resp); mediaResourceManagerImpl.setHttpRequest(null); } finally { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java index 8d240d7825e..c8e5f5ef486 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -647,7 +647,7 @@ public static Response uploadFile(String persistentId, String zipfilename, Strin Response swordStatementResponse = given() .body(bytes) .header("Packaging", "http://purl.org/net/sword/package/SimpleZip") - .header("Content-Disposition", "filename=" + zipfilename) + .header("Content-Disposition", "attachment; filename=" + zipfilename) /** * It's unclear why we need to add "preemptive" to auth but * without it we can't use send bytes using the body/content @@ -674,7 +674,7 @@ public static Response uploadZipFileViaSword(String persistentId, String pathToZ Response swordStatementResponse = given() .body(bytes) .header("Packaging", "http://purl.org/net/sword/package/SimpleZip") - .header("Content-Disposition", "filename=" + zipfilename) + .header("Content-Disposition", "attachment; filename=" + zipfilename) /** * It's unclear why we need to add "preemptive" to auth but * without it we can't use send bytes using the body/content From 7b4f827af1a885a2560ba717b52d7d34fe03ab2c Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Fri, 3 Jun 2022 12:47:28 -0400 Subject: [PATCH 023/173] stop using `@Context HttpServletRequest`, add sleep #8305 In EditDDI I was seeing a NullPointerException on line 136 (createNewDraftVersion). Switch from `@Context HttpServletRequest` to our ordinary way of API auth fixed it. In DataversesIT I was seeing an OptimisticLockException so I added a sleep. --- .../edu/harvard/iq/dataverse/api/EditDDI.java | 2 +- .../iq/dataverse/api/DataversesIT.java | 13 +++++---- .../harvard/iq/dataverse/api/EditDDIIT.java | 1 + .../edu/harvard/iq/dataverse/api/UtilIT.java | 28 +++++++++++++++++-- 4 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/EditDDI.java b/src/main/java/edu/harvard/iq/dataverse/api/EditDDI.java index 15fe3ee31fe..1b74ab5479e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/EditDDI.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/EditDDI.java @@ -34,8 +34,8 @@ import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import jakarta.ws.rs.container.ContainerRequestContext; -import jakarta.ws.rs.core.Response; import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.Response; import jakarta.ws.rs.Path; import jakarta.ws.rs.PUT; import jakarta.ws.rs.Consumes; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java index 9ef7e571e0c..eb8511f8ffe 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java @@ -508,6 +508,13 @@ public void testImportDDI() throws IOException, InterruptedException { logger.info(importDDI.prettyPrint()); assertEquals(201, importDDI.getStatusCode()); + // Under normal conditions, you shouldn't need to destroy these datasets. + // Uncomment if they're still around from a previous failed run. +// Response destroy1 = UtilIT.destroyDataset("doi:10.5072/FK2/ABCD11", apiToken); +// destroy1.prettyPrint(); +// Response destroy2 = UtilIT.destroyDataset("doi:10.5072/FK2/ABCD22", apiToken); +// destroy2.prettyPrint(); + Response importDDIPid = UtilIT.importDatasetDDIViaNativeApi(apiToken, dataverseAlias, xml, "doi:10.5072/FK2/ABCD11", "no"); logger.info(importDDIPid.prettyPrint()); assertEquals(201, importDDIPid.getStatusCode()); @@ -559,12 +566,8 @@ public void testImportDDI() throws IOException, InterruptedException { Integer datasetIdIntPidRel = JsonPath.from(importDDIPidRel.body().asString()).getInt("data.id"); Response destroyDatasetResponsePidRel = UtilIT.destroyDataset(datasetIdIntPidRel, apiToken); assertEquals(200, destroyDatasetResponsePidRel.getStatusCode()); - - // This last dataset we have just imported, let's give it a sec. to finish indexing (?) - // or whatever it is that may still be happening. (Have been seeing intermittent 500 from the next - // destroyDataset() line lately) - Thread.sleep(1000L); + UtilIT.sleepForDeadlock(UtilIT.MAXIMUM_IMPORT_DURATION); Integer datasetIdIntRelease = JsonPath.from(importDDIRelease.body().asString()).getInt("data.id"); Response destroyDatasetResponseRelease = UtilIT.destroyDataset(datasetIdIntRelease, apiToken); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/EditDDIIT.java b/src/test/java/edu/harvard/iq/dataverse/api/EditDDIIT.java index 3ed8215b34d..5295637dd4f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/EditDDIIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/EditDDIIT.java @@ -148,6 +148,7 @@ public void testUpdateVariableMetadata() throws InterruptedException { assertEquals(200, publishDataset.getStatusCode()); Response editDDIResponseNewDraft = UtilIT.editDDI(stringOrigXml, origFileId, apiToken); + editDDIResponseNewDraft.prettyPrint(); assertEquals(200, editDDIResponseNewDraft.getStatusCode()); //not authorized diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java index c8e5f5ef486..a39891bbaa1 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -65,6 +65,7 @@ public class UtilIT { private static final String EMPTY_STRING = ""; public static final int MAXIMUM_INGEST_LOCK_DURATION = 15; public static final int MAXIMUM_PUBLISH_LOCK_DURATION = 15; + public static final int MAXIMUM_IMPORT_DURATION = 1; private static SwordConfigurationImpl swordConfiguration = new SwordConfigurationImpl(); @@ -1245,6 +1246,12 @@ static Response destroyDataset(Integer datasetId, String apiToken) { .delete("/api/datasets/" + datasetId + "/destroy"); } + static Response destroyDataset(String pid, String apiToken) { + return given() + .header(API_TOKEN_HTTP_HEADER, apiToken) + .delete("/api/datasets/:persistentId/destroy?persistentId=" + pid); + } + static Response deleteFile(Integer fileId, String apiToken) { return given() .auth().basic(apiToken, EMPTY_STRING) @@ -2569,9 +2576,24 @@ static boolean sleepForReexport(String idOrPersistentId, String apiToken, int du return i <= repeats; } - - - + + // Modeled after sleepForLock but the dataset isn't locked. + // We have to sleep or we can't perform the next operation. + static Boolean sleepForDeadlock(int duration) { + int i = 0; + do { + try { + Thread.sleep(1000); + i++; + if (i > duration) { + break; + } + } catch (InterruptedException ex) { + Logger.getLogger(UtilIT.class.getName()).log(Level.SEVERE, null, ex); + } + } while (true); + return i <= duration; + } //Helper function that returns true if a given search returns a non-zero response within a fixed time limit // a given duration returns false if still zero results after given duration From 77e35a6bc6ee4f28018ff022af0582a72505a6f1 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Wed, 28 Jun 2023 21:57:45 +0200 Subject: [PATCH 024/173] Update installer, DockerAIO, Vagrant, some scripts and docs for Payara 6 #8305 --- conf/docker-aio/0prep_deps.sh | 4 +- conf/docker-aio/c8.dockerfile | 6 +- conf/docker-aio/configure_doi.bash | 2 +- conf/docker-aio/entrypoint.bash | 2 +- conf/docker-aio/testscripts/install | 4 +- conf/docker-aio/testscripts/post | 2 + conf/jhove/jhove.conf | 2 +- .../admin/counter-processor-config.yaml | 4 +- .../files/etc/init.d/payara.init.root | 2 +- .../files/etc/init.d/payara.init.service | 2 +- .../files/etc/systemd/payara.service | 6 +- .../domains/domain1/config/logging.properties | 166 ------------------ .../source/_static/util/clear_timer.sh | 2 +- .../source/_static/util/counter_daily.sh | 2 +- .../source/admin/harvestclients.rst | 6 +- .../source/admin/make-data-count.rst | 4 +- .../source/admin/troubleshooting.rst | 10 +- .../source/developers/big-data-support.rst | 16 +- .../source/developers/debugging.rst | 4 +- .../source/developers/dev-environment.rst | 8 +- .../source/developers/make-data-count.rst | 2 +- .../source/developers/testing.rst | 24 +-- doc/sphinx-guides/source/developers/tips.rst | 10 +- .../source/installation/advanced.rst | 4 +- .../source/installation/config.rst | 18 +- .../source/installation/installation-main.rst | 10 +- .../source/installation/intro.rst | 2 +- .../source/installation/prerequisites.rst | 18 +- downloads/.gitignore | 2 +- downloads/download.sh | 2 +- scripts/dev/dev-rebuild.sh | 2 +- scripts/installer/as-setup.sh | 18 +- scripts/installer/install | 18 +- scripts/installer/install.py | 10 +- scripts/installer/installAppServer.py | 2 +- scripts/installer/installUtils.py | 2 +- scripts/installer/interactive.config | 2 +- .../ec2-memory-benchmark-remote.sh | 2 +- scripts/vagrant/setup.sh | 8 +- 39 files changed, 122 insertions(+), 288 deletions(-) delete mode 100644 doc/sphinx-guides/source/_static/installation/files/usr/local/payara5/glassfish/domains/domain1/config/logging.properties diff --git a/conf/docker-aio/0prep_deps.sh b/conf/docker-aio/0prep_deps.sh index 13a91705303..204e60a137f 100755 --- a/conf/docker-aio/0prep_deps.sh +++ b/conf/docker-aio/0prep_deps.sh @@ -4,9 +4,9 @@ if [ ! -d dv/deps ]; then fi wdir=`pwd` -if [ ! -e dv/deps/payara-5.2022.3.zip ]; then +if [ ! -e dv/deps/payara-6.2023.6.zip ]; then echo "payara dependency prep" - wget https://s3-eu-west-1.amazonaws.com/payara.fish/Payara+Downloads/5.2022.3/payara-5.2022.3.zip -O dv/deps/payara-5.2022.3.zip + wget https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/6.2023.6/payara-6.2023.6.zip -O dv/deps/payara-6.2023.6.zip fi if [ ! -e dv/deps/solr-8.11.1dv.tgz ]; then diff --git a/conf/docker-aio/c8.dockerfile b/conf/docker-aio/c8.dockerfile index 0002464cbf2..a2a187c07ae 100644 --- a/conf/docker-aio/c8.dockerfile +++ b/conf/docker-aio/c8.dockerfile @@ -24,11 +24,11 @@ COPY disableipv6.conf /etc/sysctl.d/ RUN rm /etc/httpd/conf/* COPY httpd.conf /etc/httpd/conf RUN cd /opt ; tar zxf /tmp/dv/deps/solr-8.11.1dv.tgz -RUN cd /opt ; unzip /tmp/dv/deps/payara-5.2022.3.zip ; ln -s /opt/payara5 /opt/glassfish4 +RUN cd /opt ; unzip /tmp/dv/deps/payara-6.2023.6.zip ; ln -s /opt/payara6 /opt/glassfish4 # this copy of domain.xml is the result of running `asadmin set server.monitoring-service.module-monitoring-levels.jvm=LOW` on a default glassfish installation (aka - enable the glassfish REST monitir endpoint for the jvm` # this dies under Java 11, do we keep it? -#COPY domain-restmonitor.xml /opt/payara5/glassfish/domains/domain1/config/domain.xml +#COPY domain-restmonitor.xml /opt/payara6/glassfish/domains/domain1/config/domain.xml RUN sudo -u postgres /usr/pgsql-13/bin/initdb -D /var/lib/pgsql/13/data -E 'UTF-8' @@ -59,7 +59,7 @@ EXPOSE 9009 RUN mkdir /opt/dv # keeping the symlink on the off chance that something else is still assuming /usr/local/glassfish4 -RUN ln -s /opt/payara5 /usr/local/glassfish4 +RUN ln -s /opt/payara6 /usr/local/glassfish4 COPY dv/install/ /opt/dv/ COPY install.bash /opt/dv/ COPY entrypoint.bash /opt/dv/ diff --git a/conf/docker-aio/configure_doi.bash b/conf/docker-aio/configure_doi.bash index f0f0bc6d0d4..ce11ca48ce9 100755 --- a/conf/docker-aio/configure_doi.bash +++ b/conf/docker-aio/configure_doi.bash @@ -1,6 +1,6 @@ #!/usr/bin/env bash -cd /opt/payara5 +cd /opt/payara6 # if appropriate; reconfigure PID provider on the basis of environmental variables. if [ ! -z "${DoiProvider}" ]; then diff --git a/conf/docker-aio/entrypoint.bash b/conf/docker-aio/entrypoint.bash index 236bb30f67a..0d74981c527 100755 --- a/conf/docker-aio/entrypoint.bash +++ b/conf/docker-aio/entrypoint.bash @@ -10,7 +10,7 @@ bin/solr create_core -c collection1 -d server/solr/collection1/conf -force apachectl -DFOREGROUND & # TODO: Run Payara as non-root. -cd /opt/payara5 +cd /opt/payara6 bin/asadmin start-domain --debug sleep infinity diff --git a/conf/docker-aio/testscripts/install b/conf/docker-aio/testscripts/install index f87f180b554..43dd36da2c9 100755 --- a/conf/docker-aio/testscripts/install +++ b/conf/docker-aio/testscripts/install @@ -1,7 +1,7 @@ #!/bin/sh export HOST_ADDRESS=localhost -export GLASSFISH_ROOT=/opt/payara5 -export FILES_DIR=/opt/payara5/glassfish/domains/domain1/files +export GLASSFISH_ROOT=/opt/payara6 +export FILES_DIR=/opt/payara6/glassfish/domains/domain1/files export DB_NAME=dvndb export DB_PORT=5432 export DB_HOST=localhost diff --git a/conf/docker-aio/testscripts/post b/conf/docker-aio/testscripts/post index 0f292109d31..9d725084f07 100755 --- a/conf/docker-aio/testscripts/post +++ b/conf/docker-aio/testscripts/post @@ -6,6 +6,8 @@ psql -U dvnapp dvndb -f doc/sphinx-guides/source/_static/util/createsequence.sql scripts/search/tests/publish-dataverse-root #git checkout scripts/api/data/dv-root.json scripts/search/tests/grant-authusers-add-on-root +echo "exiting post script early (not creating test users, etc.)" +exit scripts/search/populate-users scripts/search/create-users scripts/search/tests/create-all-and-test diff --git a/conf/jhove/jhove.conf b/conf/jhove/jhove.conf index 5134ae0f81a..971c60acfaa 100644 --- a/conf/jhove/jhove.conf +++ b/conf/jhove/jhove.conf @@ -3,7 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://hul.harvard.edu/ois/xml/ns/jhove/jhoveConfig" xsi:schemaLocation="http://hul.harvard.edu/ois/xml/ns/jhove/jhoveConfig - file:///usr/local/payara5/glassfish/domains/domain1/config/jhoveConfig.xsd"> + file:///usr/local/payara6/glassfish/domains/domain1/config/jhoveConfig.xsd"> /usr/local/src/jhove utf-8 /tmp diff --git a/doc/sphinx-guides/source/_static/admin/counter-processor-config.yaml b/doc/sphinx-guides/source/_static/admin/counter-processor-config.yaml index 4f338905751..26144544d9e 100644 --- a/doc/sphinx-guides/source/_static/admin/counter-processor-config.yaml +++ b/doc/sphinx-guides/source/_static/admin/counter-processor-config.yaml @@ -1,8 +1,8 @@ # currently no other option but to have daily logs and have year-month-day format in the name with # 4-digit year and 2-digit month and day -# /usr/local/payara5/glassfish/domains/domain1/logs/counter_2019-01-11.log +# /usr/local/payara6/glassfish/domains/domain1/logs/counter_2019-01-11.log #log_name_pattern: sample_logs/counter_(yyyy-mm-dd).log -log_name_pattern: /usr/local/payara5/glassfish/domains/domain1/logs/mdc/counter_(yyyy-mm-dd).log +log_name_pattern: /usr/local/payara6/glassfish/domains/domain1/logs/mdc/counter_(yyyy-mm-dd).log # path_types regular expressions allow matching to classify page urls as either an investigation or request # based on specific URL structure for your system. diff --git a/doc/sphinx-guides/source/_static/installation/files/etc/init.d/payara.init.root b/doc/sphinx-guides/source/_static/installation/files/etc/init.d/payara.init.root index 1de94331523..b9ef9960318 100755 --- a/doc/sphinx-guides/source/_static/installation/files/etc/init.d/payara.init.root +++ b/doc/sphinx-guides/source/_static/installation/files/etc/init.d/payara.init.root @@ -4,7 +4,7 @@ set -e -ASADMIN=/usr/local/payara5/bin/asadmin +ASADMIN=/usr/local/payara6/bin/asadmin case "$1" in start) diff --git a/doc/sphinx-guides/source/_static/installation/files/etc/init.d/payara.init.service b/doc/sphinx-guides/source/_static/installation/files/etc/init.d/payara.init.service index 7c457e615d8..19bb190e740 100755 --- a/doc/sphinx-guides/source/_static/installation/files/etc/init.d/payara.init.service +++ b/doc/sphinx-guides/source/_static/installation/files/etc/init.d/payara.init.service @@ -3,7 +3,7 @@ # description: Payara App Server set -e -ASADMIN=/usr/local/payara5/bin/asadmin +ASADMIN=/usr/local/payara6/bin/asadmin APP_SERVER_USER=dataverse case "$1" in diff --git a/doc/sphinx-guides/source/_static/installation/files/etc/systemd/payara.service b/doc/sphinx-guides/source/_static/installation/files/etc/systemd/payara.service index c8c82f6d6b2..c8efcb9c6f9 100644 --- a/doc/sphinx-guides/source/_static/installation/files/etc/systemd/payara.service +++ b/doc/sphinx-guides/source/_static/installation/files/etc/systemd/payara.service @@ -4,9 +4,9 @@ After = syslog.target network.target [Service] Type = forking -ExecStart = /usr/bin/java -jar /usr/local/payara5/glassfish/lib/client/appserver-cli.jar start-domain -ExecStop = /usr/bin/java -jar /usr/local/payara5/glassfish/lib/client/appserver-cli.jar stop-domain -ExecReload = /usr/bin/java -jar /usr/local/payara5/glassfish/lib/client/appserver-cli.jar restart-domain +ExecStart = /usr/bin/java -jar /usr/local/payara6/glassfish/lib/client/appserver-cli.jar start-domain +ExecStop = /usr/bin/java -jar /usr/local/payara6/glassfish/lib/client/appserver-cli.jar stop-domain +ExecReload = /usr/bin/java -jar /usr/local/payara6/glassfish/lib/client/appserver-cli.jar restart-domain User=dataverse LimitNOFILE=32768 Environment="LANG=en_US.UTF-8" diff --git a/doc/sphinx-guides/source/_static/installation/files/usr/local/payara5/glassfish/domains/domain1/config/logging.properties b/doc/sphinx-guides/source/_static/installation/files/usr/local/payara5/glassfish/domains/domain1/config/logging.properties deleted file mode 100644 index 4054c794452..00000000000 --- a/doc/sphinx-guides/source/_static/installation/files/usr/local/payara5/glassfish/domains/domain1/config/logging.properties +++ /dev/null @@ -1,166 +0,0 @@ -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. -# -# Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved. -# -# The contents of this file are subject to the terms of either the GNU -# General Public License Version 2 only ("GPL") or the Common Development -# and Distribution License("CDDL") (collectively, the "License"). You -# may not use this file except in compliance with the License. You can -# obtain a copy of the License at -# https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html -# or packager/legal/LICENSE.txt. See the License for the specific -# language governing permissions and limitations under the License. -# -# When distributing the software, include this License Header Notice in each -# file and include the License file at packager/legal/LICENSE.txt. -# -# GPL Classpath Exception: -# Oracle designates this particular file as subject to the "Classpath" -# exception as provided by Oracle in the GPL Version 2 section of the License -# file that accompanied this code. -# -# Modifications: -# If applicable, add the following below the License Header, with the fields -# enclosed by brackets [] replaced by your own identifying information: -# "Portions Copyright [year] [name of copyright owner]" -# -# Contributor(s): -# If you wish your version of this file to be governed by only the CDDL or -# only the GPL Version 2, indicate your decision by adding "[Contributor] -# elects to include this software in this distribution under the [CDDL or GPL -# Version 2] license." If you don't indicate a single choice of license, a -# recipient has the option to distribute your version of this file under -# either the CDDL, the GPL Version 2 or to extend the choice of license to -# its licensees as provided above. However, if you add GPL Version 2 code -# and therefore, elected the GPL Version 2 license, then the option applies -# only if the new code is made subject to such option by the copyright -# holder. -# -# Portions Copyright [2016-2021] [Payara Foundation and/or its affiliates] - -#GlassFish logging.properties list -#Update June 13 2012 - -#All attributes details -handlers=java.util.logging.ConsoleHandler -handlerServices=com.sun.enterprise.server.logging.GFFileHandler,com.sun.enterprise.server.logging.SyslogHandler -java.util.logging.ConsoleHandler.formatter=com.sun.enterprise.server.logging.UniformLogFormatter -java.util.logging.FileHandler.count=1 -java.util.logging.FileHandler.formatter=java.util.logging.XMLFormatter -java.util.logging.FileHandler.limit=50000 -java.util.logging.FileHandler.pattern=%h/java%u.log -com.sun.enterprise.server.logging.GFFileHandler.compressOnRotation=false -com.sun.enterprise.server.logging.GFFileHandler.excludeFields= -com.sun.enterprise.server.logging.GFFileHandler.file=${com.sun.aas.instanceRoot}/logs/server.log -com.sun.enterprise.server.logging.GFFileHandler.flushFrequency=1 -com.sun.enterprise.server.logging.GFFileHandler.formatter=com.sun.enterprise.server.logging.ODLLogFormatter -com.sun.enterprise.server.logging.GFFileHandler.level=ALL -com.sun.enterprise.server.logging.GFFileHandler.logStandardStreams=true -com.sun.enterprise.server.logging.GFFileHandler.logtoConsole=false -com.sun.enterprise.server.logging.GFFileHandler.logtoFile=true -com.sun.enterprise.server.logging.GFFileHandler.maxHistoryFiles=0 -com.sun.enterprise.server.logging.GFFileHandler.multiLineMode=true -com.sun.enterprise.server.logging.GFFileHandler.retainErrorsStasticsForHours=0 -com.sun.enterprise.server.logging.GFFileHandler.rotationLimitInBytes=2000000 -com.sun.enterprise.server.logging.GFFileHandler.rotationOnDateChange=false -com.sun.enterprise.server.logging.GFFileHandler.rotationTimelimitInMinutes=0 -com.sun.enterprise.server.logging.SyslogHandler.level=ALL -com.sun.enterprise.server.logging.SyslogHandler.useSystemLogging=false -log4j.logger.org.hibernate.validator.util.Version=warn -com.sun.enterprise.server.logging.UniformLogFormatter.ansiColor=true - -#Payara Notification logging properties -fish.payara.enterprise.server.logging.PayaraNotificationFileHandler.compressOnRotation=false -fish.payara.enterprise.server.logging.PayaraNotificationFileHandler.file=${com.sun.aas.instanceRoot}/logs/notification.log -fish.payara.enterprise.server.logging.PayaraNotificationFileHandler.formatter=com.sun.enterprise.server.logging.ODLLogFormatter -fish.payara.enterprise.server.logging.PayaraNotificationFileHandler.logtoFile=true -fish.payara.enterprise.server.logging.PayaraNotificationFileHandler.maxHistoryFiles=0 -fish.payara.enterprise.server.logging.PayaraNotificationFileHandler.rotationLimitInBytes=2000000 -fish.payara.enterprise.server.logging.PayaraNotificationFileHandler.rotationOnDateChange=false -fish.payara.enterprise.server.logging.PayaraNotificationFileHandler.rotationTimelimitInMinutes=0 -fish.payara.deprecated.jsonlogformatter.underscoreprefix=false - -#All log level details - -.level=INFO -ShoalLogger.level=CONFIG -com.hazelcast.level=WARNING -java.util.logging.ConsoleHandler.level=FINEST -javax.enterprise.resource.corba.level=INFO -javax.enterprise.resource.javamail.level=INFO -javax.enterprise.resource.jdo.level=INFO -javax.enterprise.resource.jms.level=INFO -javax.enterprise.resource.jta.level=INFO -javax.enterprise.resource.resourceadapter.level=INFO -javax.enterprise.resource.sqltrace.level=FINE -javax.enterprise.resource.webcontainer.jsf.application.level=INFO -javax.enterprise.resource.webcontainer.jsf.config.level=INFO -javax.enterprise.resource.webcontainer.jsf.context.level=INFO -javax.enterprise.resource.webcontainer.jsf.facelets.level=INFO -javax.enterprise.resource.webcontainer.jsf.lifecycle.level=INFO -javax.enterprise.resource.webcontainer.jsf.managedbean.level=INFO -javax.enterprise.resource.webcontainer.jsf.renderkit.level=INFO -javax.enterprise.resource.webcontainer.jsf.resource.level=INFO -javax.enterprise.resource.webcontainer.jsf.taglib.level=INFO -javax.enterprise.resource.webcontainer.jsf.timing.level=INFO -javax.enterprise.system.container.cmp.level=INFO -javax.enterprise.system.container.ejb.level=INFO -javax.enterprise.system.container.ejb.mdb.level=INFO -javax.enterprise.system.container.web.level=INFO -javax.enterprise.system.core.classloading.level=INFO -javax.enterprise.system.core.config.level=INFO -javax.enterprise.system.core.level=INFO -javax.enterprise.system.core.security.level=INFO -javax.enterprise.system.core.selfmanagement.level=INFO -javax.enterprise.system.core.transaction.level=INFO -javax.enterprise.system.level=INFO -javax.enterprise.system.ssl.security.level=INFO -javax.enterprise.system.tools.admin.level=INFO -javax.enterprise.system.tools.backup.level=INFO -javax.enterprise.system.tools.deployment.common.level=WARNING -javax.enterprise.system.tools.deployment.dol.level=WARNING -javax.enterprise.system.tools.deployment.level=INFO -javax.enterprise.system.util.level=INFO -javax.enterprise.system.webservices.registry.level=INFO -javax.enterprise.system.webservices.rpc.level=INFO -javax.enterprise.system.webservices.saaj.level=INFO -javax.level=INFO -javax.mail.level=INFO -javax.org.glassfish.persistence.level=INFO -org.apache.catalina.level=INFO -org.apache.coyote.level=INFO -org.apache.jasper.level=INFO -org.eclipse.persistence.session.level=INFO -org.glassfish.admingui.level=INFO -org.glassfish.naming.level=INFO -org.jvnet.hk2.osgiadapter.level=INFO - -javax.enterprise.resource.corba.level=INFO -javax.enterprise.resource.jta.level=INFO -javax.enterprise.system.webservices.saaj.level=INFO -javax.enterprise.system.container.ejb.level=INFO -javax.enterprise.system.container.ejb.mdb.level=INFO -javax.enterprise.resource.javamail.level=INFO -javax.enterprise.system.webservices.rpc.level=INFO -javax.enterprise.system.container.web.level=INFO -javax.enterprise.resource.jms.level=INFO -javax.enterprise.system.webservices.registry.level=INFO -javax.enterprise.resource.webcontainer.jsf.application.level=INFO -javax.enterprise.resource.webcontainer.jsf.resource.level=INFO -javax.enterprise.resource.webcontainer.jsf.config.level=INFO -javax.enterprise.resource.webcontainer.jsf.context.level=INFO -javax.enterprise.resource.webcontainer.jsf.facelets.level=INFO -javax.enterprise.resource.webcontainer.jsf.lifecycle.level=INFO -javax.enterprise.resource.webcontainer.jsf.managedbean.level=INFO -javax.enterprise.resource.webcontainer.jsf.renderkit.level=INFO -javax.enterprise.resource.webcontainer.jsf.taglib.level=INFO -javax.enterprise.resource.webcontainer.jsf.timing.level=INFO -javax.org.glassfish.persistence.level=INFO -javax.enterprise.system.tools.backup.level=INFO -javax.mail.level=INFO -org.glassfish.admingui.level=INFO -org.glassfish.naming.level=INFO -org.eclipse.persistence.session.level=INFO -javax.enterprise.system.tools.deployment.dol.level=WARNING -javax.enterprise.system.tools.deployment.common.level=WARNING diff --git a/doc/sphinx-guides/source/_static/util/clear_timer.sh b/doc/sphinx-guides/source/_static/util/clear_timer.sh index 1d9966e4e07..641b2695084 100755 --- a/doc/sphinx-guides/source/_static/util/clear_timer.sh +++ b/doc/sphinx-guides/source/_static/util/clear_timer.sh @@ -8,7 +8,7 @@ # if you'd like to avoid that. # directory where Payara is installed -PAYARA_DIR=/usr/local/payara5 +PAYARA_DIR=/usr/local/payara6 # directory within Payara (defaults) DV_DIR=${PAYARA_DIR}/glassfish/domains/domain1 diff --git a/doc/sphinx-guides/source/_static/util/counter_daily.sh b/doc/sphinx-guides/source/_static/util/counter_daily.sh index a12439d9cf8..674972b18f2 100644 --- a/doc/sphinx-guides/source/_static/util/counter_daily.sh +++ b/doc/sphinx-guides/source/_static/util/counter_daily.sh @@ -1,7 +1,7 @@ #! /bin/bash COUNTER_PROCESSOR_DIRECTORY="/usr/local/counter-processor-0.1.04" -MDC_LOG_DIRECTORY="/usr/local/payara5/glassfish/domains/domain1/logs/mdc" +MDC_LOG_DIRECTORY="/usr/local/payara6/glassfish/domains/domain1/logs/mdc" # counter_daily.sh diff --git a/doc/sphinx-guides/source/admin/harvestclients.rst b/doc/sphinx-guides/source/admin/harvestclients.rst index da922459f46..59fc4dc2c64 100644 --- a/doc/sphinx-guides/source/admin/harvestclients.rst +++ b/doc/sphinx-guides/source/admin/harvestclients.rst @@ -35,8 +35,8 @@ For example: .. code-block:: bash - sudo touch /usr/local/payara5/glassfish/domains/domain1/logs/stopharvest_bigarchive.70916 - sudo chown dataverse /usr/local/payara5/glassfish/domains/domain1/logs/stopharvest_bigarchive.70916 + sudo touch /usr/local/payara6/glassfish/domains/domain1/logs/stopharvest_bigarchive.70916 + sudo chown dataverse /usr/local/payara6/glassfish/domains/domain1/logs/stopharvest_bigarchive.70916 Note: If the application server is stopped and restarted, any running harvesting jobs will be killed but may remain marked as in progress in the database. We thus recommend using the mechanism here to stop ongoing harvests prior to a server restart. @@ -44,6 +44,6 @@ Note: If the application server is stopped and restarted, any running harvesting What if a Run Fails? ~~~~~~~~~~~~~~~~~~~~ -Each harvesting client run logs a separate file per run to the app server's default logging directory (``/usr/local/payara5/glassfish/domains/domain1/logs/`` unless you've changed it). Look for filenames in the format ``harvest_TARGET_YYYY_MM_DD_timestamp.log`` to get a better idea of what's going wrong. +Each harvesting client run logs a separate file per run to the app server's default logging directory (``/usr/local/payara6/glassfish/domains/domain1/logs/`` unless you've changed it). Look for filenames in the format ``harvest_TARGET_YYYY_MM_DD_timestamp.log`` to get a better idea of what's going wrong. Note that you'll want to run a minimum of Dataverse Software 4.6, optimally 4.18 or beyond, for the best OAI-PMH interoperability. diff --git a/doc/sphinx-guides/source/admin/make-data-count.rst b/doc/sphinx-guides/source/admin/make-data-count.rst index 521ee4f97ca..2062c97c69f 100644 --- a/doc/sphinx-guides/source/admin/make-data-count.rst +++ b/doc/sphinx-guides/source/admin/make-data-count.rst @@ -72,7 +72,7 @@ Enable or Disable Display of Make Data Count Metrics By default, when MDC logging is enabled (when ``:MDCLogPath`` is set), your Dataverse installation will display MDC metrics instead of it's internal (legacy) metrics. You can avoid this (e.g. to collect MDC metrics for some period of time before starting to display them) by setting ``:DisplayMDCMetrics`` to false. -The following discussion assumes ``:MDCLogPath`` has been set to ``/usr/local/payara5/glassfish/domains/domain1/logs/mdc`` +The following discussion assumes ``:MDCLogPath`` has been set to ``/usr/local/payara6/glassfish/domains/domain1/logs/mdc`` Configure Counter Processor ~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -102,7 +102,7 @@ Soon we will be setting up a cron job to run nightly but we start with a single * If you are running Counter Processor for the first time in the middle of a month, you will need create blank log files for the previous days. e.g.: - * ``cd /usr/local/payara5/glassfish/domains/domain1/logs/mdc`` + * ``cd /usr/local/payara6/glassfish/domains/domain1/logs/mdc`` * ``touch counter_2019-02-01.log`` diff --git a/doc/sphinx-guides/source/admin/troubleshooting.rst b/doc/sphinx-guides/source/admin/troubleshooting.rst index 9f085ba90cd..acbdcaae17e 100644 --- a/doc/sphinx-guides/source/admin/troubleshooting.rst +++ b/doc/sphinx-guides/source/admin/troubleshooting.rst @@ -53,15 +53,13 @@ Long-Running Ingest Jobs Have Exhausted System Resources Ingest is both CPU- and memory-intensive, and depending on your system resources and the size and format of tabular data files uploaded, may render your Dataverse installation unresponsive or nearly inoperable. It is possible to cancel these jobs by purging the ingest queue. -``/usr/local/payara5/mq/bin/imqcmd -u admin query dst -t q -n DataverseIngest`` will query the DataverseIngest destination. The password, unless you have changed it, matches the username. +``/usr/local/payara6/mq/bin/imqcmd -u admin query dst -t q -n DataverseIngest`` will query the DataverseIngest destination. The password, unless you have changed it, matches the username. -``/usr/local/payara5/mq/bin/imqcmd -u admin purge dst -t q -n DataverseIngest`` will purge the DataverseIngest queue, and prompt for your confirmation. +``/usr/local/payara6/mq/bin/imqcmd -u admin purge dst -t q -n DataverseIngest`` will purge the DataverseIngest queue, and prompt for your confirmation. Finally, list destinations to verify that the purge was successful: -``/usr/local/payara5/mq/bin/imqcmd -u admin list dst`` - -If you are still running Glassfish, substitute glassfish4 for payara5 above. If you have installed your Dataverse installation in some other location, adjust the above paths accordingly. +``/usr/local/payara6/mq/bin/imqcmd -u admin list dst`` .. _troubleshooting-payara: @@ -73,7 +71,7 @@ Payara Finding the Payara Log File ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -``/usr/local/payara5/glassfish/domains/domain1/logs/server.log`` is the main place to look when you encounter problems (assuming you installed Payara in the default directory). Hopefully an error message has been logged. If there's a stack trace, it may be of interest to developers, especially they can trace line numbers back to a tagged version or commit. Send more of the stack trace (the entire file if possible) to developers who can help (see "Getting Help", below) and be sure to say which version of the Dataverse Software you have installed. +``/usr/local/payara6/glassfish/domains/domain1/logs/server.log`` is the main place to look when you encounter problems (assuming you installed Payara in the default directory). Hopefully an error message has been logged. If there's a stack trace, it may be of interest to developers, especially they can trace line numbers back to a tagged version or commit. Send more of the stack trace (the entire file if possible) to developers who can help (see "Getting Help", below) and be sure to say which version of the Dataverse Software you have installed. .. _increase-payara-logging: diff --git a/doc/sphinx-guides/source/developers/big-data-support.rst b/doc/sphinx-guides/source/developers/big-data-support.rst index 734f678ceb9..9588189a521 100644 --- a/doc/sphinx-guides/source/developers/big-data-support.rst +++ b/doc/sphinx-guides/source/developers/big-data-support.rst @@ -197,7 +197,7 @@ The JSON that a DCM sends to your Dataverse installation on successful checksum :language: json - ``status`` - The valid strings to send are ``validation passed`` and ``validation failed``. -- ``uploadFolder`` - This is the directory on disk where your Dataverse installation should attempt to find the files that a DCM has moved into place. There should always be a ``files.sha`` file and a least one data file. ``files.sha`` is a manifest of all the data files and their checksums. The ``uploadFolder`` directory is inside the directory where data is stored for the dataset and may have the same name as the "identifier" of the persistent id (DOI or Handle). For example, you would send ``"uploadFolder": "DNXV2H"`` in the JSON file when the absolute path to this directory is ``/usr/local/payara5/glassfish/domains/domain1/files/10.5072/FK2/DNXV2H/DNXV2H``. +- ``uploadFolder`` - This is the directory on disk where your Dataverse installation should attempt to find the files that a DCM has moved into place. There should always be a ``files.sha`` file and a least one data file. ``files.sha`` is a manifest of all the data files and their checksums. The ``uploadFolder`` directory is inside the directory where data is stored for the dataset and may have the same name as the "identifier" of the persistent id (DOI or Handle). For example, you would send ``"uploadFolder": "DNXV2H"`` in the JSON file when the absolute path to this directory is ``/usr/local/payara6/glassfish/domains/domain1/files/10.5072/FK2/DNXV2H/DNXV2H``. - ``totalSize`` - Your Dataverse installation will use this value to represent the total size in bytes of all the files in the "package" that's created. If 360 data files and one ``files.sha`` manifest file are in the ``uploadFolder``, this value is the sum of the 360 data files. @@ -219,9 +219,9 @@ Add Dataverse Installation settings to use mock (same as using DCM, noted above) At this point you should be able to download a placeholder rsync script. Your Dataverse installation is then waiting for news from the DCM about if checksum validation has succeeded or not. First, you have to put files in place, which is usually the job of the DCM. You should substitute "X1METO" for the "identifier" of the dataset you create. You must also use the proper path for where you store files in your dev environment. -- ``mkdir /usr/local/payara5/glassfish/domains/domain1/files/10.5072/FK2/X1METO`` -- ``mkdir /usr/local/payara5/glassfish/domains/domain1/files/10.5072/FK2/X1METO/X1METO`` -- ``cd /usr/local/payara5/glassfish/domains/domain1/files/10.5072/FK2/X1METO/X1METO`` +- ``mkdir /usr/local/payara6/glassfish/domains/domain1/files/10.5072/FK2/X1METO`` +- ``mkdir /usr/local/payara6/glassfish/domains/domain1/files/10.5072/FK2/X1METO/X1METO`` +- ``cd /usr/local/payara6/glassfish/domains/domain1/files/10.5072/FK2/X1METO/X1METO`` - ``echo "hello" > file1.txt`` - ``shasum file1.txt > files.sha`` @@ -265,7 +265,7 @@ Optional steps for setting up the S3 Docker DCM Variant - Set S3 as the storage driver - - ``cd /opt/payara5/bin/`` + - ``cd /opt/payara6/bin/`` - ``./asadmin delete-jvm-options "\-Ddataverse.files.storage-driver-id=file"`` - ``./asadmin create-jvm-options "\-Ddataverse.files.storage-driver-id=s3"`` - ``./asadmin create-jvm-options "\-Ddataverse.files.s3.type=s3"`` @@ -288,11 +288,11 @@ Optional steps for setting up the S3 Docker DCM Variant - S3 bucket for your Dataverse installation - - ``/usr/local/payara5/glassfish/bin/asadmin create-jvm-options "-Ddataverse.files.s3.bucket-name=iqsstestdcmbucket"`` + - ``/usr/local/payara6/glassfish/bin/asadmin create-jvm-options "-Ddataverse.files.s3.bucket-name=iqsstestdcmbucket"`` - S3 bucket for DCM (as your Dataverse installation needs to do the copy over) - - ``/usr/local/payara5/glassfish/bin/asadmin create-jvm-options "-Ddataverse.files.dcm-s3-bucket-name=test-dcm"`` + - ``/usr/local/payara6/glassfish/bin/asadmin create-jvm-options "-Ddataverse.files.dcm-s3-bucket-name=test-dcm"`` - Set download method to be HTTP, as DCM downloads through S3 are over this protocol ``curl -X PUT "http://localhost:8080/api/admin/settings/:DownloadMethods" -d "native/http"`` @@ -325,7 +325,7 @@ Additional DCM docker development tips - There are a few logs to tail - - dvsrv : ``tail -n 2000 -f /opt/payara5/glassfish/domains/domain1/logs/server.log`` + - dvsrv : ``tail -n 2000 -f /opt/payara6/glassfish/domains/domain1/logs/server.log`` - dcmsrv : ``tail -n 2000 -f /var/log/lighttpd/breakage.log`` - dcmsrv : ``tail -n 2000 -f /var/log/lighttpd/access.log`` diff --git a/doc/sphinx-guides/source/developers/debugging.rst b/doc/sphinx-guides/source/developers/debugging.rst index 2088afe5521..50e8901b1ff 100644 --- a/doc/sphinx-guides/source/developers/debugging.rst +++ b/doc/sphinx-guides/source/developers/debugging.rst @@ -20,8 +20,8 @@ during development without recompiling. Changing the options will require at lea how you get these options in. (Variable substitution only happens during deployment and when using system properties or environment variables, you'll need to pass these into the domain, which usually will require an app server restart.) -Please note that since Payara 5.2021.1 supporting MicroProfile Config 2.0, you can -`use profiles `_ +Please note you can use +`MicroProfile Config `_ to maintain your settings more easily for different environments. .. list-table:: diff --git a/doc/sphinx-guides/source/developers/dev-environment.rst b/doc/sphinx-guides/source/developers/dev-environment.rst index b3f7fb1c1af..5520c645188 100755 --- a/doc/sphinx-guides/source/developers/dev-environment.rst +++ b/doc/sphinx-guides/source/developers/dev-environment.rst @@ -89,17 +89,17 @@ On Linux, install ``jq`` from your package manager or download a binary from htt Install Payara ~~~~~~~~~~~~~~ -Payara 5.2022.3 or higher is required. +Payara 6.2023.6 or higher is required. To install Payara, run the following commands: ``cd /usr/local`` -``sudo curl -O -L https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/5.2022.3/payara-5.2022.3.zip`` +``sudo curl -O -L https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/6.2023.6/payara-6.2023.6.zip`` -``sudo unzip payara-5.2022.3.zip`` +``sudo unzip payara-6.2023.6.zip`` -``sudo chown -R $USER /usr/local/payara5`` +``sudo chown -R $USER /usr/local/payara6`` If nexus.payara.fish is ever down for maintenance, Payara distributions are also available from https://repo1.maven.org/maven2/fish/payara/distributions/payara/ diff --git a/doc/sphinx-guides/source/developers/make-data-count.rst b/doc/sphinx-guides/source/developers/make-data-count.rst index a3c0d10dc5e..ada0f13bb2f 100644 --- a/doc/sphinx-guides/source/developers/make-data-count.rst +++ b/doc/sphinx-guides/source/developers/make-data-count.rst @@ -38,7 +38,7 @@ Next you need to have the Dataverse installation add some entries to the log tha Next you should run Counter Processor to convert the log into a SUSHI report, which is in JSON format. Before running Counter Processor, you need to put a configuration file into place. As a starting point use :download:`counter-processor-config.yaml <../../../../scripts/vagrant/counter-processor-config.yaml>` and edit the file, paying particular attention to the following settings: -- ``log_name_pattern`` You might want something like ``/usr/local/payara5/glassfish/domains/domain1/logs/counter_(yyyy-mm-dd).log`` +- ``log_name_pattern`` You might want something like ``/usr/local/payara6/glassfish/domains/domain1/logs/counter_(yyyy-mm-dd).log`` - ``year_month`` You should probably set this to the current month. - ``output_file`` This needs to be a directory that the "dataverse" Unix user can read but that the "counter" user can write to. In dev, you can probably get away with "/tmp" as the directory. - ``platform`` Out of the box from Counter Processor this is set to ``Dash`` but this should be changed to match the name of your Dataverse installation. Examples are "Harvard Dataverse Repository" for Harvard University or "LibraData" for the University of Virginia. diff --git a/doc/sphinx-guides/source/developers/testing.rst b/doc/sphinx-guides/source/developers/testing.rst index 55351b851bb..13c2b2f7bff 100755 --- a/doc/sphinx-guides/source/developers/testing.rst +++ b/doc/sphinx-guides/source/developers/testing.rst @@ -308,9 +308,9 @@ To run these tests, simply call out to Maven: Measuring Coverage of Integration Tests --------------------------------------- -Measuring the code coverage of integration tests with Jacoco requires several steps. In order to make these steps clear we'll use "/usr/local/payara5" as the Payara directory and "dataverse" as the Payara Unix user. +Measuring the code coverage of integration tests with Jacoco requires several steps. In order to make these steps clear we'll use "/usr/local/payara6" as the Payara directory and "dataverse" as the Payara Unix user. -Please note that this was tested under Glassfish 4 but it is hoped that the same steps will work with Payara 5. +Please note that this was tested under Glassfish 4 but it is hoped that the same steps will work with Payara. Add jacocoagent.jar to Payara ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -329,9 +329,9 @@ Note that we are running the following commands as the user "dataverse". In shor cd local/jacoco-0.8.1 wget https://github.com/jacoco/jacoco/releases/download/v0.8.1/jacoco-0.8.1.zip unzip jacoco-0.8.1.zip - /usr/local/payara5/bin/asadmin stop-domain - cp /home/dataverse/local/jacoco-0.8.1/lib/jacocoagent.jar /usr/local/payara5/glassfish/lib - /usr/local/payara5/bin/asadmin start-domain + /usr/local/payara6/bin/asadmin stop-domain + cp /home/dataverse/local/jacoco-0.8.1/lib/jacocoagent.jar /usr/local/payara6/glassfish/lib + /usr/local/payara6/bin/asadmin start-domain Add jacococli.jar to the WAR File ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -354,21 +354,21 @@ Run this as the "dataverse" user. .. code-block:: bash - /usr/local/payara5/bin/asadmin deploy dataverse-jacoco.war + /usr/local/payara6/bin/asadmin deploy dataverse-jacoco.war -Note that after deployment the file "/usr/local/payara5/glassfish/domains/domain1/config/jacoco.exec" exists and is empty. +Note that after deployment the file "/usr/local/payara6/glassfish/domains/domain1/config/jacoco.exec" exists and is empty. Run Integration Tests ~~~~~~~~~~~~~~~~~~~~~ Note that even though you see "docker-aio" in the command below, we assume you are not necessarily running the test suite within Docker. (Some day we'll probably move this script to another directory.) For this reason, we pass the URL with the normal port (8080) that app servers run on to the ``run-test-suite.sh`` script. -Note that "/usr/local/payara5/glassfish/domains/domain1/config/jacoco.exec" will become non-empty after you stop and start Payara. You must stop and start Payara before every run of the integration test suite. +Note that "/usr/local/payara6/glassfish/domains/domain1/config/jacoco.exec" will become non-empty after you stop and start Payara. You must stop and start Payara before every run of the integration test suite. .. code-block:: bash - /usr/local/payara5/bin/asadmin stop-domain - /usr/local/payara5/bin/asadmin start-domain + /usr/local/payara6/bin/asadmin stop-domain + /usr/local/payara6/bin/asadmin start-domain git clone https://github.com/IQSS/dataverse.git cd dataverse conf/docker-aio/run-test-suite.sh http://localhost:8080 @@ -383,7 +383,7 @@ Run these commands as the "dataverse" user. The ``cd dataverse`` means that you .. code-block:: bash cd dataverse - java -jar /home/dataverse/local/jacoco-0.8.1/lib/jacococli.jar report --classfiles target/classes --sourcefiles src/main/java --html target/coverage-it/ /usr/local/payara5/glassfish/domains/domain1/config/jacoco.exec + java -jar /home/dataverse/local/jacoco-0.8.1/lib/jacococli.jar report --classfiles target/classes --sourcefiles src/main/java --html target/coverage-it/ /usr/local/payara6/glassfish/domains/domain1/config/jacoco.exec Read Code Coverage Report ~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -484,7 +484,7 @@ Future Work on Unit Tests - Review pull requests from @bencomp for ideas for approaches to testing: https://github.com/IQSS/dataverse/pulls?q=is%3Apr+author%3Abencomp - Come up with a way to test commands: http://irclog.iq.harvard.edu/dataverse/2015-11-04#i_26750 -- Test EJBs using Arquillian, embedded app servers, or similar. @bmckinney kicked the tires on Arquillian at https://github.com/bmckinney/bio-dataverse/commit/2f243b1db1ca704a42cd0a5de329083763b7c37a +- Test EJBs using Arquillian, embedded app servers, or similar. @bmckinney kicked the tires on Arquillian at https://github.com/bmckinney/bio-dataverse/commit/2f243b1db1ca704a42cd0a6de329083763b7c37a Future Work on Integration Tests ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/doc/sphinx-guides/source/developers/tips.rst b/doc/sphinx-guides/source/developers/tips.rst index bf75a05f84e..e1ee40cafa5 100755 --- a/doc/sphinx-guides/source/developers/tips.rst +++ b/doc/sphinx-guides/source/developers/tips.rst @@ -19,20 +19,20 @@ Undeploy the war File from the Dataverse Software Installation Script Because the initial deployment of the war file was done outside of Netbeans by the Dataverse Software installation script, it's a good idea to undeploy that war file to give Netbeans a clean slate to work with. -Assuming you installed Payara in ``/usr/local/payara5``, run the following ``asadmin`` command to see the version of the Dataverse Software that the Dataverse Software installation script deployed: +Assuming you installed Payara in ``/usr/local/payara6``, run the following ``asadmin`` command to see the version of the Dataverse Software that the Dataverse Software installation script deployed: -``/usr/local/payara5/bin/asadmin list-applications`` +``/usr/local/payara6/bin/asadmin list-applications`` You will probably see something like ``dataverse-5.0 `` as the output. To undeploy, use whichever version you see like this: -``/usr/local/payara5/bin/asadmin undeploy dataverse-5.0`` +``/usr/local/payara6/bin/asadmin undeploy dataverse-5.0`` Now that Payara doesn't have anything deployed, we can proceed with getting Netbeans set up to deploy the code. Add Payara as a Server in Netbeans ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Launch Netbeans and click "Tools" and then "Servers". Click "Add Server" and select "Payara Server" and set the installation location to ``/usr/local/payara5``. The defaults are fine so you can click "Next" and "Finish". +Launch Netbeans and click "Tools" and then "Servers". Click "Add Server" and select "Payara Server" and set the installation location to ``/usr/local/payara6``. The defaults are fine so you can click "Next" and "Finish". Please note that if you are on a Mac, Netbeans may be unable to start Payara due to proxy settings in Netbeans. Go to the "General" tab in Netbeans preferences and click "Test connection" to see if you are affected. If you get a green checkmark, you're all set. If you get a red exclamation mark, change "Proxy Settings" to "No Proxy" and retest. A more complicated answer having to do with changing network settings is available at https://discussions.apple.com/thread/7680039?answerId=30715103022#30715103022 and the bug is also described at https://netbeans.org/bugzilla/show_bug.cgi?id=268076 @@ -117,7 +117,7 @@ Deploying With ``asadmin`` Sometimes you want to deploy code without using Netbeans or from the command line on a server you have ssh'ed into. -For the ``asadmin`` commands below, we assume you have already changed directories to ``/usr/local/payara5/glassfish/bin`` or wherever you have installed Payara. +For the ``asadmin`` commands below, we assume you have already changed directories to ``/usr/local/payara6/glassfish/bin`` or wherever you have installed Payara. There are four steps to this process: diff --git a/doc/sphinx-guides/source/installation/advanced.rst b/doc/sphinx-guides/source/installation/advanced.rst index a842d566595..87f2a4fd0ab 100644 --- a/doc/sphinx-guides/source/installation/advanced.rst +++ b/doc/sphinx-guides/source/installation/advanced.rst @@ -13,8 +13,8 @@ Multiple App Servers You should be conscious of the following when running multiple app servers. - Only one app server can be the dedicated timer server, as explained in the :doc:`/admin/timers` section of the Admin Guide. -- When users upload a logo or footer for their Dataverse collection using the "theme" feature described in the :doc:`/user/dataverse-management` section of the User Guide, these logos are stored only on the app server the user happened to be on when uploading the logo. By default these logos and footers are written to the directory ``/usr/local/payara5/glassfish/domains/domain1/docroot/logos``. -- When a sitemap is created by an app server it is written to the filesystem of just that app server. By default the sitemap is written to the directory ``/usr/local/payara5/glassfish/domains/domain1/docroot/sitemap``. +- When users upload a logo or footer for their Dataverse collection using the "theme" feature described in the :doc:`/user/dataverse-management` section of the User Guide, these logos are stored only on the app server the user happened to be on when uploading the logo. By default these logos and footers are written to the directory ``/usr/local/payara6/glassfish/domains/domain1/docroot/logos``. +- When a sitemap is created by an app server it is written to the filesystem of just that app server. By default the sitemap is written to the directory ``/usr/local/payara6/glassfish/domains/domain1/docroot/sitemap``. - If Make Data Count is used, its raw logs must be copied from each app server to single instance of Counter Processor. See also :ref:`:MDCLogPath` section in the Configuration section of this guide and the :doc:`/admin/make-data-count` section of the Admin Guide. - Dataset draft version logging occurs separately on each app server. See :ref:`edit-draft-versions-logging` section in Monitoring of the Admin Guide for details. - Password aliases (``dataverse.db.password``, etc.) are stored per app server. diff --git a/doc/sphinx-guides/source/installation/config.rst b/doc/sphinx-guides/source/installation/config.rst index 34217c2e73f..c3cda737bbe 100644 --- a/doc/sphinx-guides/source/installation/config.rst +++ b/doc/sphinx-guides/source/installation/config.rst @@ -495,7 +495,7 @@ Logging & Slow Performance File Storage: Using a Local Filesystem and/or Swift and/or Object Stores and/or Trusted Remote Stores ----------------------------------------------------------------------------------------------------- -By default, a Dataverse installation stores all data files (files uploaded by end users) on the filesystem at ``/usr/local/payara5/glassfish/domains/domain1/files``. This path can vary based on answers you gave to the installer (see the :ref:`dataverse-installer` section of the Installation Guide) or afterward by reconfiguring the ``dataverse.files.\.directory`` JVM option described below. +By default, a Dataverse installation stores all data files (files uploaded by end users) on the filesystem at ``/usr/local/payara6/glassfish/domains/domain1/files``. This path can vary based on answers you gave to the installer (see the :ref:`dataverse-installer` section of the Installation Guide) or afterward by reconfiguring the ``dataverse.files.\.directory`` JVM option described below. A Dataverse installation can alternately store files in a Swift or S3-compatible object store, and can now be configured to support multiple stores at once. With a multi-store configuration, the location for new files can be controlled on a per-Dataverse collection basis. @@ -969,7 +969,7 @@ All of these processes are triggered after finishing transfers over the wire and Before being moved there, - JSF Web UI uploads are stored at :ref:`${dataverse.files.uploads} `, defaulting to - ``/usr/local/payara5/glassfish/domains/domain1/uploads`` folder in a standard installation. This place is + ``/usr/local/payara6/glassfish/domains/domain1/uploads`` folder in a standard installation. This place is configurable and might be set to a separate disk volume where stale uploads are purged periodically. - API uploads are stored at the system's temporary files location indicated by the Java system property ``java.io.tmpdir``, defaulting to ``/tmp`` on Linux. If this location is backed by a `tmpfs `_ @@ -1047,7 +1047,7 @@ Custom Navbar Logo The Dataverse Software allows you to replace the default Dataverse Project icon and name branding in the navbar with your own custom logo. Note that this logo is separate from the logo used in the theme of the root Dataverse collection (see :ref:`theme`). -The custom logo image file is expected to be small enough to fit comfortably in the navbar, no more than 50 pixels in height and 160 pixels in width. Create a ``navbar`` directory in your Payara ``logos`` directory and place your custom logo there. By default, your logo image file will be located at ``/usr/local/payara5/glassfish/domains/domain1/docroot/logos/navbar/logo.png``. +The custom logo image file is expected to be small enough to fit comfortably in the navbar, no more than 50 pixels in height and 160 pixels in width. Create a ``navbar`` directory in your Payara ``logos`` directory and place your custom logo there. By default, your logo image file will be located at ``/usr/local/payara6/glassfish/domains/domain1/docroot/logos/navbar/logo.png``. Given this location for the custom logo image file, run this curl command to add it to your settings: @@ -1512,7 +1512,7 @@ The Google Cloud Archiver also requires a key file that must be renamed to 'goog For example: -``cp /usr/local/payara5/glassfish/domains/domain1/files/googlecloudkey.json`` +``cp /usr/local/payara6/glassfish/domains/domain1/files/googlecloudkey.json`` .. _S3 Archiver Configuration: @@ -1628,7 +1628,7 @@ You have a couple of options for putting an updated robots.txt file into product For more of an explanation of ``ProxyPassMatch`` see the :doc:`shibboleth` section. -If you are not fronting Payara with Apache you'll need to prevent Payara from serving the robots.txt file embedded in the war file by overwriting robots.txt after the war file has been deployed. The downside of this technique is that you will have to remember to overwrite robots.txt in the "exploded" war file each time you deploy the war file, which probably means each time you upgrade to a new version of the Dataverse Software. Furthermore, since the version of the Dataverse Software is always incrementing and the version can be part of the file path, you will need to be conscious of where on disk you need to replace the file. For example, for Dataverse Software 4.6.1 the path to robots.txt may be ``/usr/local/payara5/glassfish/domains/domain1/applications/dataverse-4.6.1/robots.txt`` with the version number ``4.6.1`` as part of the path. +If you are not fronting Payara with Apache you'll need to prevent Payara from serving the robots.txt file embedded in the war file by overwriting robots.txt after the war file has been deployed. The downside of this technique is that you will have to remember to overwrite robots.txt in the "exploded" war file each time you deploy the war file, which probably means each time you upgrade to a new version of the Dataverse Software. Furthermore, since the version of the Dataverse Software is always incrementing and the version can be part of the file path, you will need to be conscious of where on disk you need to replace the file. For example, for Dataverse Software 4.6.1 the path to robots.txt may be ``/usr/local/payara6/glassfish/domains/domain1/applications/dataverse-4.6.1/robots.txt`` with the version number ``4.6.1`` as part of the path. Creating a Sitemap and Submitting it to Search Engines ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1641,7 +1641,7 @@ Create or update your sitemap by adding the following curl command to cron to ru This will create or update a file in the following location unless you have customized your installation directory for Payara: -``/usr/local/payara5/glassfish/domains/domain1/docroot/sitemap/sitemap.xml`` +``/usr/local/payara6/glassfish/domains/domain1/docroot/sitemap/sitemap.xml`` On Dataverse installation with many datasets, the creation or updating of the sitemap can take a while. You can check Payara's server.log file for "BEGIN updateSiteMap" and "END updateSiteMap" lines to know when the process started and stopped and any errors in between. @@ -1684,7 +1684,7 @@ When changing values these values with ``asadmin``, you'll need to delete the ol ``./asadmin create-jvm-options "-Ddataverse.fqdn=dataverse.example.com"`` -It's also possible to change these values by stopping Payara, editing ``payara5/glassfish/domains/domain1/config/domain.xml``, and restarting Payara. +It's also possible to change these values by stopping Payara, editing ``payara6/glassfish/domains/domain1/config/domain.xml``, and restarting Payara. .. _dataverse.fqdn: @@ -1780,7 +1780,7 @@ Configure a folder to store the incoming file stream during uploads (before tran Please also see :ref:`temporary-file-storage` for more details. You can use an absolute path or a relative, which is relative to the application server domain directory. -Defaults to ``./uploads``, which resolves to ``/usr/local/payara5/glassfish/domains/domain1/uploads`` in a default +Defaults to ``./uploads``, which resolves to ``/usr/local/payara6/glassfish/domains/domain1/uploads`` in a default installation. Can also be set via *MicroProfile Config API* sources, e.g. the environment variable ``DATAVERSE_FILES_UPLOADS``. @@ -3449,7 +3449,7 @@ Sets how long a cached metrics result is used before re-running the query for a Sets the path where the raw Make Data Count logs are stored before being processed. If not set, no logs will be created for Make Data Count. See also the :doc:`/admin/make-data-count` section of the Admin Guide. -``curl -X PUT -d '/usr/local/payara5/glassfish/domains/domain1/logs' http://localhost:8080/api/admin/settings/:MDCLogPath`` +``curl -X PUT -d '/usr/local/payara6/glassfish/domains/domain1/logs' http://localhost:8080/api/admin/settings/:MDCLogPath`` .. _:DisplayMDCMetrics: diff --git a/doc/sphinx-guides/source/installation/installation-main.rst b/doc/sphinx-guides/source/installation/installation-main.rst index 8559d6ce194..021a97415e3 100755 --- a/doc/sphinx-guides/source/installation/installation-main.rst +++ b/doc/sphinx-guides/source/installation/installation-main.rst @@ -28,8 +28,8 @@ Unpack the zip file - this will create the directory ``dvinstall``. Just make sure the user running the installer has write permission to: -- /usr/local/payara5/glassfish/lib -- /usr/local/payara5/glassfish/domains/domain1 +- /usr/local/payara6/glassfish/lib +- /usr/local/payara6/glassfish/domains/domain1 - the current working directory of the installer (it currently writes its logfile there), and - your jvm-option specified files.dir @@ -47,7 +47,7 @@ Follow the instructions in the text file. The script will prompt you for some configuration values. If this is a test/evaluation installation, it may be possible to accept the default values provided for most of the settings: - Internet Address of your host: localhost -- Payara Directory: /usr/local/payara5 +- Payara Directory: /usr/local/payara6 - Payara User: current user running the installer script - Administrator email address for this Dataverse installation: (none) - SMTP (mail) server to relay notification messages: localhost @@ -98,7 +98,7 @@ The supplied site URL will be saved under the JVM option :ref:`dataverse.siteUrl **IMPORTANT:** Please note, that "out of the box" the installer will configure the Dataverse installation to leave unrestricted access to the administration APIs from (and only from) localhost. Please consider the security implications of this arrangement (anyone with shell access to the server can potentially mess with your Dataverse installation). An alternative solution would be to block open access to these sensitive API endpoints completely; and to only allow requests supplying a pre-defined "unblock token" (password). If you prefer that as a solution, please consult the supplied script ``post-install-api-block.sh`` for examples on how to set it up. See also "Securing Your Installation" under the :doc:`config` section. -The Dataverse Software uses JHOVE_ to help identify the file format (CSV, PNG, etc.) for files that users have uploaded. The installer places files called ``jhove.conf`` and ``jhoveConfig.xsd`` into the directory ``/usr/local/payara5/glassfish/domains/domain1/config`` by default and makes adjustments to the jhove.conf file based on the directory into which you chose to install Payara. +The Dataverse Software uses JHOVE_ to help identify the file format (CSV, PNG, etc.) for files that users have uploaded. The installer places files called ``jhove.conf`` and ``jhoveConfig.xsd`` into the directory ``/usr/local/payara6/glassfish/domains/domain1/config`` by default and makes adjustments to the jhove.conf file based on the directory into which you chose to install Payara. .. _JHOVE: http://jhove.openpreservation.org @@ -249,7 +249,7 @@ Deleting Uploaded Files The path below will depend on the value for ``dataverse.files.directory`` as described in the :doc:`config` section: -``rm -rf /usr/local/payara5/glassfish/domains/domain1/files`` +``rm -rf /usr/local/payara6/glassfish/domains/domain1/files`` Rerun Installer ^^^^^^^^^^^^^^^ diff --git a/doc/sphinx-guides/source/installation/intro.rst b/doc/sphinx-guides/source/installation/intro.rst index 2251af7b81b..67fc774bdbd 100644 --- a/doc/sphinx-guides/source/installation/intro.rst +++ b/doc/sphinx-guides/source/installation/intro.rst @@ -48,7 +48,7 @@ If you've encountered a problem installing Dataverse and are ready to ask for he - Operating system (usually a Linux distribution) and version. - Output from the installer (STDOUT, STDERR). - The ``scripts/api/setup-all.*.log`` files left behind by the installer. -- The ``server.log`` file from Payara (by default at ``/usr/local/payara5/glassfish/domains/domain1/logs/server.log``). +- The ``server.log`` file from Payara (by default at ``/usr/local/payara6/glassfish/domains/domain1/logs/server.log``). Improving this Guide -------------------- diff --git a/doc/sphinx-guides/source/installation/prerequisites.rst b/doc/sphinx-guides/source/installation/prerequisites.rst index d95aa78bb26..15d5001d35d 100644 --- a/doc/sphinx-guides/source/installation/prerequisites.rst +++ b/doc/sphinx-guides/source/installation/prerequisites.rst @@ -44,7 +44,7 @@ On RHEL/derivative you can make Java 11 the default with the ``alternatives`` co Payara ------ -Payara 5.2022.3 is recommended. Newer versions might work fine, regular updates are recommended. +Payara 6.2023.6 is recommended. Newer versions might work fine. Regular updates are recommended. Installing Payara ================= @@ -53,11 +53,11 @@ Installing Payara # useradd dataverse -- Download and install Payara (installed in ``/usr/local/payara5`` in the example commands below):: +- Download and install Payara (installed in ``/usr/local/payara6`` in the example commands below):: - # wget https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/5.2022.3/payara-5.2022.3.zip - # unzip payara-5.2022.3.zip - # mv payara5 /usr/local + # wget https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/6.2023.6/payara-6.2023.6.zip + # unzip payara-6.2023.6.zip + # mv payara6 /usr/local If nexus.payara.fish is ever down for maintenance, Payara distributions are also available from https://repo1.maven.org/maven2/fish/payara/distributions/payara/ @@ -65,15 +65,15 @@ If you intend to install and run Payara under a service account (and we hope you - Set service account permissions:: - # chown -R root:root /usr/local/payara5 - # chown dataverse /usr/local/payara5/glassfish/lib - # chown -R dataverse:dataverse /usr/local/payara5/glassfish/domains/domain1 + # chown -R root:root /usr/local/payara6 + # chown dataverse /usr/local/payara6/glassfish/lib + # chown -R dataverse:dataverse /usr/local/payara6/glassfish/domains/domain1 After installation, you may chown the lib/ directory back to root; the installer only needs write access to copy the JDBC driver into that directory. - Change from ``-client`` to ``-server`` under ``-client``:: - # vim /usr/local/payara5/glassfish/domains/domain1/config/domain.xml + # vim /usr/local/payara6/glassfish/domains/domain1/config/domain.xml This recommendation comes from http://www.c2b2.co.uk/middleware-blog/glassfish-4-performance-tuning-monitoring-and-troubleshooting.php among other places. diff --git a/downloads/.gitignore b/downloads/.gitignore index 1b51bf4def7..c21ee37922f 100644 --- a/downloads/.gitignore +++ b/downloads/.gitignore @@ -1,4 +1,4 @@ -payara-5.201.zip +payara-6.2023.6.zip solr-7.3.0.tgz weld-osgi-bundle-2.2.10.Final-glassfish4.jar schemaSpy_5.0.0.jar diff --git a/downloads/download.sh b/downloads/download.sh index 7b9de0397cb..4db4e7c5c8f 100755 --- a/downloads/download.sh +++ b/downloads/download.sh @@ -1,5 +1,5 @@ #!/bin/sh -curl -L -O https://s3-eu-west-1.amazonaws.com/payara.fish/Payara+Downloads/5.2022.3/payara-5.2022.3.zip +curl -L -O https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/6.2023.6/payara-6.2023.6.zip curl -L -O https://archive.apache.org/dist/lucene/solr/8.11.1/solr-8.11.1.tgz curl -L -O https://search.maven.org/remotecontent?filepath=org/jboss/weld/weld-osgi-bundle/2.2.10.Final/weld-osgi-bundle-2.2.10.Final-glassfish4.jar curl -s -L http://sourceforge.net/projects/schemaspy/files/schemaspy/SchemaSpy%205.0.0/schemaSpy_5.0.0.jar/download > schemaSpy_5.0.0.jar diff --git a/scripts/dev/dev-rebuild.sh b/scripts/dev/dev-rebuild.sh index 71857b14068..9f296c6cc29 100755 --- a/scripts/dev/dev-rebuild.sh +++ b/scripts/dev/dev-rebuild.sh @@ -1,5 +1,5 @@ #!/bin/sh -PAYARA_DIR=/usr/local/payara5 +PAYARA_DIR=/usr/local/payara6 ASADMIN=$PAYARA_DIR/glassfish/bin/asadmin DB_NAME=dvndb DB_USER=dvnapp diff --git a/scripts/installer/as-setup.sh b/scripts/installer/as-setup.sh index 49ebce059d2..a5729eaef65 100755 --- a/scripts/installer/as-setup.sh +++ b/scripts/installer/as-setup.sh @@ -56,15 +56,15 @@ function preliminary_setup() # avoid OutOfMemoryError: PermGen per http://eugenedvorkin.com/java-lang-outofmemoryerror-permgen-space-error-during-deployment-to-glassfish/ #./asadmin $ASADMIN_OPTS list-jvm-options - # Note that these JVM options are different for Payara5 and Glassfish4: + # Note that these JVM options are different for Payara and Glassfish4: # old Glassfish4 options: (commented out) #./asadmin $ASADMIN_OPTS delete-jvm-options "-XX\:MaxPermSize=192m" #./asadmin $ASADMIN_OPTS create-jvm-options "-XX\:MaxPermSize=512m" #./asadmin $ASADMIN_OPTS create-jvm-options "-XX\:PermSize=256m" - # payara5 ships with the "-server" option already in domain.xml, so no need: + # payara6 ships with the "-server" option already in domain.xml, so no need: #./asadmin $ASADMIN_OPTS delete-jvm-options -client - # new Payara5 options: (thanks to donsizemore@unc.edu) + # new Payara options: (thanks to donsizemore@unc.edu) ./asadmin $ASADMIN_OPTS create-jvm-options "-XX\:MaxMetaspaceSize=512m" ./asadmin $ASADMIN_OPTS create-jvm-options "-XX\:MetaspaceSize=256m" ./asadmin $ASADMIN_OPTS create-jvm-options "-Dfish.payara.classloading.delegate=false" @@ -155,18 +155,18 @@ function final_setup(){ if [ "$DOCKER_BUILD" = "true" ] then - FILES_DIR="/usr/local/payara5/glassfish/domains/domain1/files" + FILES_DIR="/usr/local/payara6/glassfish/domains/domain1/files" RSERVE_HOST="localhost" RSERVE_PORT="6311" RSERVE_USER="rserve" RSERVE_PASS="rserve" HOST_ADDRESS="localhost\:8080" - pushd /usr/local/payara5/glassfish/bin/ + pushd /usr/local/payara6/glassfish/bin/ ./asadmin start-domain domain1 preliminary_setup - chmod -R 777 /usr/local/payara5/ - rm -rf /usr/local/payara5/glassfish/domains/domain1/generated - rm -rf /usr/local/payara5/glassfish/domains/domain1/applications + chmod -R 777 /usr/local/payara6/ + rm -rf /usr/local/payara6/glassfish/domains/domain1/generated + rm -rf /usr/local/payara6/glassfish/domains/domain1/applications popd exit 0 fi @@ -276,7 +276,7 @@ if [ ! -d "$DOMAIN_DIR" ] exit 2 fi -echo "Setting up your app. server (Payara5) to support Dataverse" +echo "Setting up your app. server (Payara) to support Dataverse" echo "Payara directory: "$GLASSFISH_ROOT echo "Domain directory: "$DOMAIN_DIR diff --git a/scripts/installer/install b/scripts/installer/install index 2208f014606..46f9917d08c 100755 --- a/scripts/installer/install +++ b/scripts/installer/install @@ -463,7 +463,7 @@ for my $ENTRY (@CONFIG_VARIABLES) if (!(-w ($g_dir . $test_dir))) { print "\n"; - die("ERROR: " . $g_dir . $test_dir . " not writable to the user running the installer! Check permissions on Payara5 hierarchy.\n"); + die("ERROR: " . $g_dir . $test_dir . " not writable to the user running the installer! Check permissions on Payara6 hierarchy.\n"); } } @@ -685,7 +685,7 @@ print "can publish datasets. Once you receive the account name and password, add print "as the following two JVM options:\n"; print "\t-Ddoi.username=...\n"; print "\t-Ddoi.password=...\n"; -print "and restart payara5\n"; +print "and restart payara6\n"; print "If this is a production Dataverse and you are planning to register datasets as \n"; print "\"real\", non-test DOIs or Handles, consult the \"Persistent Identifiers and Publishing Datasets\"\n"; print "section of the Installataion guide, on how to configure your Dataverse with the proper registration\n"; @@ -749,7 +749,7 @@ sub setup_appserver { my $glassfish_dir = $CONFIG_DEFAULTS{'GLASSFISH_DIRECTORY'}; - print "\nProceeding with the app. server (Payara5) setup.\n"; + print "\nProceeding with the app. server (Payara6) setup.\n"; # 5a. DETERMINE HOW MUCH MEMORY TO GIVE TO GLASSFISH AS HEAP: @@ -816,7 +816,7 @@ sub setup_appserver { # amount of memory: $gf_heap_default = ( int( $sys_mem_total / ( 8 / 3 * 1024 ) ) ); - print "\nSetting the heap limit for Payara5 to " . $gf_heap_default . "MB. \n"; + print "\nSetting the heap limit for Payara6 to " . $gf_heap_default . "MB. \n"; print "You may need to adjust this setting to better suit \n"; print "your system.\n\n"; @@ -826,7 +826,7 @@ sub setup_appserver { else { print "\nCould not determine the amount of memory on your system.\n"; - print "Setting the heap limit for Payara5 to 2GB. You may need \n"; + print "Setting the heap limit for Payara6 to 2GB. You may need \n"; print "to adjust the value to better suit your system.\n\n"; } @@ -834,7 +834,7 @@ sub setup_appserver { $CONFIG_DEFAULTS{"DEF_MEM_SIZE"} = $gf_heap_default; # TODO: -# is the below still the case with Payara5? +# is the below still the case with Payara6? # if the system has more than 4GB of memory (I believe), glassfish must # be run with the 64 bit flag set explicitly (at least that was the case # with the MacOS glassfish build...). Verify, and if still the case, @@ -905,7 +905,7 @@ sub setup_appserver { # CHECK EXIT STATUS, BARF IF SETUP SCRIPT FAILED: unless ($success) { - print "\nERROR! Failed to configure Payara5 domain!\n"; + print "\nERROR! Failed to configure Payara6 domain!\n"; print "(see the error messages above - if any)\n"; print "Aborting...\n"; @@ -954,9 +954,9 @@ sub setup_appserver { # The JHOVE conf file has an absolute PATH of the JHOVE config schema file (uh, yeah...) # - so it may need to be readjusted here: - if ( $glassfish_dir ne "/usr/local/payara5" ) + if ( $glassfish_dir ne "/usr/local/payara6" ) { - system( "sed 's:/usr/local/payara5:$glassfish_dir:g' < " . $JHOVE_CONFIG_DIST . " > " . $glassfish_dir . "/glassfish/domains/domain1/config/" . $JHOVE_CONFIG); + system( "sed 's:/usr/local/payara6:$glassfish_dir:g' < " . $JHOVE_CONFIG_DIST . " > " . $glassfish_dir . "/glassfish/domains/domain1/config/" . $JHOVE_CONFIG); } else { diff --git a/scripts/installer/install.py b/scripts/installer/install.py index 5acb4d760a4..a7f11f352ed 100644 --- a/scripts/installer/install.py +++ b/scripts/installer/install.py @@ -314,7 +314,7 @@ gfDir = config.get('glassfish', 'GLASSFISH_DIRECTORY') while not test_appserver_directory(gfDir): print("\nInvalid Payara directory!") - gfDir = read_user_input("Enter the root directory of your Payara5 installation:\n(Or ctrl-C to exit the installer): ") + gfDir = read_user_input("Enter the root directory of your Payara installation:\n(Or ctrl-C to exit the installer): ") config.set('glassfish', 'GLASSFISH_DIRECTORY', gfDir) elif option == "mail_server": mailServer = config.get('system', 'MAIL_SERVER') @@ -511,12 +511,12 @@ try: copy2(jhoveConfigSchemaDist, gfConfigDir) # The JHOVE conf file has an absolute PATH of the JHOVE config schema file (uh, yeah...) - # and may need to be adjusted, if Payara is installed anywhere other than /usr/local/payara5: - if gfDir == "/usr/local/payara5": + # and may need to be adjusted, if Payara is installed anywhere other than /usr/local/payara6: + if gfDir == "/usr/local/payara6": copy2(jhoveConfigDist, gfConfigDir) else: - # use sed to replace /usr/local/payara5 in the distribution copy with the real gfDir: - sedCommand = "sed 's:/usr/local/payara5:"+gfDir+":g' < " + jhoveConfigDist + " > " + gfConfigDir + "/" + jhoveConfig + # use sed to replace /usr/local/payara6 in the distribution copy with the real gfDir: + sedCommand = "sed 's:/usr/local/payara6:"+gfDir+":g' < " + jhoveConfigDist + " > " + gfConfigDir + "/" + jhoveConfig subprocess.call(sedCommand, shell=True) print("done.") diff --git a/scripts/installer/installAppServer.py b/scripts/installer/installAppServer.py index 8b719ac09d1..698f5ba9a58 100644 --- a/scripts/installer/installAppServer.py +++ b/scripts/installer/installAppServer.py @@ -3,7 +3,7 @@ def runAsadminScript(config): # We are going to run a standalone shell script with a bunch of asadmin - # commands to set up all the app. server (payara5) components for the application. + # commands to set up all the app. server (payara6) components for the application. # All the parameters must be passed to that script as environmental # variables: os.environ['GLASSFISH_DOMAIN'] = "domain1"; diff --git a/scripts/installer/installUtils.py b/scripts/installer/installUtils.py index 7cc368de5f8..ff5e6eb708d 100644 --- a/scripts/installer/installUtils.py +++ b/scripts/installer/installUtils.py @@ -57,7 +57,7 @@ def test_appserver_directory(directory): #print("version: major: "+str(major_version)+", minor: "+str(minor_version)) - if major_version != 5 or minor_version < 201: + if major_version != 6 or minor_version < 2023: return False return True diff --git a/scripts/installer/interactive.config b/scripts/installer/interactive.config index 86ea926fe5d..ef8110c554f 100644 --- a/scripts/installer/interactive.config +++ b/scripts/installer/interactive.config @@ -26,7 +26,7 @@ DOI_BASEURL = Datacite URL DOI_DATACITERESTAPIURL = Datacite REST API URL [comments] HOST_DNS_ADDRESS = :(enter numeric IP address, if FQDN is unavailable) -GLASSFISH_USER = :This user will be running the App. Server (Payara5) service on your system.\n - If this is a dev. environment, this should be your own username; \n - In production, we suggest you create the account "dataverse", or use any other unprivileged user account\n: +GLASSFISH_USER = :This user will be running the App. Server (Payara) service on your system.\n - If this is a dev. environment, this should be your own username; \n - In production, we suggest you create the account "dataverse", or use any other unprivileged user account\n: GLASSFISH_DIRECTORY = GLASSFISH_REQUEST_TIMEOUT = :\n Defaults to 1800 seconds (30 minutes) ADMIN_EMAIL = :\n(please enter a valid email address!) diff --git a/scripts/tests/ec2-memory-benchmark/ec2-memory-benchmark-remote.sh b/scripts/tests/ec2-memory-benchmark/ec2-memory-benchmark-remote.sh index 0cfdd20c272..367aa214563 100755 --- a/scripts/tests/ec2-memory-benchmark/ec2-memory-benchmark-remote.sh +++ b/scripts/tests/ec2-memory-benchmark/ec2-memory-benchmark-remote.sh @@ -5,7 +5,7 @@ then EC2_HTTP_LOCATION="" fi -DATAVERSE_APP_DIR=/usr/local/payara5/glassfish/domains/domain1/applications/dataverse; export DATAVERSE_APP_DIR +DATAVERSE_APP_DIR=/usr/local/payara6/glassfish/domains/domain1/applications/dataverse; export DATAVERSE_APP_DIR # restart app server diff --git a/scripts/vagrant/setup.sh b/scripts/vagrant/setup.sh index 0af4afb22af..c74865e61a8 100644 --- a/scripts/vagrant/setup.sh +++ b/scripts/vagrant/setup.sh @@ -51,7 +51,7 @@ SOLR_USER=solr echo "Ensuring Unix user '$SOLR_USER' exists" useradd $SOLR_USER || : DOWNLOAD_DIR='/dataverse/downloads' -PAYARA_ZIP="$DOWNLOAD_DIR/payara-5.2022.3.zip" +PAYARA_ZIP="$DOWNLOAD_DIR/payara-6.2023.6.zip" SOLR_TGZ="$DOWNLOAD_DIR/solr-8.11.1.tgz" if [ ! -f $PAYARA_ZIP ] || [ ! -f $SOLR_TGZ ]; then echo "Couldn't find $PAYARA_ZIP or $SOLR_TGZ! Running download script...." @@ -59,13 +59,13 @@ if [ ! -f $PAYARA_ZIP ] || [ ! -f $SOLR_TGZ ]; then echo "Done running download script." fi PAYARA_USER_HOME=~dataverse -PAYARA_ROOT=/usr/local/payara5 +PAYARA_ROOT=/usr/local/payara6 if [ ! -d $PAYARA_ROOT ]; then echo "Copying $PAYARA_ZIP to $PAYARA_USER_HOME and unzipping" su $PAYARA_USER -s /bin/sh -c "cp $PAYARA_ZIP $PAYARA_USER_HOME" su $PAYARA_USER -s /bin/sh -c "cd $PAYARA_USER_HOME && unzip -q $PAYARA_ZIP" - # default.config defaults to /usr/local/payara5 so let's go with that - rsync -a $PAYARA_USER_HOME/payara5/ $PAYARA_ROOT/ + # default.config defaults to /usr/local/payara6 so let's go with that + rsync -a $PAYARA_USER_HOME/payara6/ $PAYARA_ROOT/ else echo "$PAYARA_ROOT already exists" fi From d882c418dc2aae436e2c509a58e1b0b30d0d6cd2 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Fri, 25 Mar 2022 15:12:37 +0100 Subject: [PATCH 025/173] chore(jsf): migrate Faces config and web.xml to Jakarta EE 10 #8305 Involves Jakarta Faces 4.0 and Servlet 6.0 --- src/main/webapp/WEB-INF/faces-config.xml | 7 +++---- src/main/webapp/WEB-INF/web.xml | 5 ++++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/webapp/WEB-INF/faces-config.xml b/src/main/webapp/WEB-INF/faces-config.xml index 2015ca55f5f..6eeb5a65baf 100644 --- a/src/main/webapp/WEB-INF/faces-config.xml +++ b/src/main/webapp/WEB-INF/faces-config.xml @@ -1,8 +1,7 @@ - + xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-facesconfig_4_0.xsd" + version="4.0"> edu.harvard.iq.dataverse.util.LocalBundle diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index dced5893908..69d3218e38e 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -1,5 +1,8 @@ - + Dataverse From b6659d4b827c2faed45010ea5f8b2fc2b877e94a Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Wed, 28 Jun 2023 23:17:36 +0200 Subject: [PATCH 026/173] fix(ct): optimize base image for Payara 6 #8305 --- modules/container-base/src/main/docker/Dockerfile | 2 +- .../src/main/docker/scripts/removeExpiredCaCerts.sh | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/modules/container-base/src/main/docker/Dockerfile b/modules/container-base/src/main/docker/Dockerfile index bbd02a14328..148c29e0ed1 100644 --- a/modules/container-base/src/main/docker/Dockerfile +++ b/modules/container-base/src/main/docker/Dockerfile @@ -206,7 +206,7 @@ RUN <org.apache.jasper.servlet.JspServlet#org.apache.jasper.servlet.JspServlet\n \n development\n false\n \n \n genStrAsCharArray\n true\n #' "${DOMAIN_DIR}/config/default-web.xml" + sed -i 's#org.glassfish.wasp.servlet.JspServlet#org.glassfish.wasp.servlet.JspServlet\n \n development\n false\n \n \n genStrAsCharArray\n true\n #' "${DOMAIN_DIR}/config/default-web.xml" # Cleanup old CA certificates to avoid unnecessary log clutter during startup ${SCRIPT_DIR}/removeExpiredCaCerts.sh # Delete generated files diff --git a/modules/container-base/src/main/docker/scripts/removeExpiredCaCerts.sh b/modules/container-base/src/main/docker/scripts/removeExpiredCaCerts.sh index 205a9eda5d7..c019c09130e 100644 --- a/modules/container-base/src/main/docker/scripts/removeExpiredCaCerts.sh +++ b/modules/container-base/src/main/docker/scripts/removeExpiredCaCerts.sh @@ -8,6 +8,14 @@ set -euo pipefail KEYSTORE="${DOMAIN_DIR}/config/cacerts.jks" +if [ ! -r "${KEYSTORE}" ]; then + KEYSTORE="${DOMAIN_DIR}/config/cacerts.p12" + if [ ! -r "${KEYSTORE}" ]; then + echo "Could not find CA certs keystore" + exit 1 + fi +fi + keytool -list -v -keystore "${KEYSTORE}" -storepass changeit 2>/dev/null | \ grep -i 'alias\|until' > aliases.txt From 7ce2cc94df4d5f91102e97d206cd189400e1c507 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Wed, 28 Jun 2023 23:51:05 +0200 Subject: [PATCH 027/173] fix(ui): make citation download widget JSF 4 compliant The backing bean actions were attached to normal "" elements, which means they were executed on page load and not, as expected, via JavaScript onClick. Former versions of JSF were less strict, now we need to use the standard compliant "" --- src/main/webapp/dataset-citation.xhtml | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/main/webapp/dataset-citation.xhtml b/src/main/webapp/dataset-citation.xhtml index 9baced25be0..b42dd5e563f 100644 --- a/src/main/webapp/dataset-citation.xhtml +++ b/src/main/webapp/dataset-citation.xhtml @@ -33,19 +33,13 @@ From f587bfb09f3635c55dda1d3f0d7d61ce937658a2 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Tue, 18 Jul 2023 23:10:13 +0200 Subject: [PATCH 028/173] chore(deps): update to Payara 6.2023.7 --- conf/docker-aio/0prep_deps.sh | 4 ++-- conf/docker-aio/c8.dockerfile | 2 +- doc/sphinx-guides/source/developers/dev-environment.rst | 6 +++--- doc/sphinx-guides/source/installation/prerequisites.rst | 6 +++--- downloads/download.sh | 2 +- modules/dataverse-parent/pom.xml | 2 +- scripts/vagrant/setup.sh | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/conf/docker-aio/0prep_deps.sh b/conf/docker-aio/0prep_deps.sh index 204e60a137f..bee8f09e9f5 100755 --- a/conf/docker-aio/0prep_deps.sh +++ b/conf/docker-aio/0prep_deps.sh @@ -4,9 +4,9 @@ if [ ! -d dv/deps ]; then fi wdir=`pwd` -if [ ! -e dv/deps/payara-6.2023.6.zip ]; then +if [ ! -e dv/deps/payara-6.2023.7.zip ]; then echo "payara dependency prep" - wget https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/6.2023.6/payara-6.2023.6.zip -O dv/deps/payara-6.2023.6.zip + wget https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/6.2023.7/payara-6.2023.7.zip -O dv/deps/payara-6.2023.7.zip fi if [ ! -e dv/deps/solr-8.11.1dv.tgz ]; then diff --git a/conf/docker-aio/c8.dockerfile b/conf/docker-aio/c8.dockerfile index a2a187c07ae..9f20ae0a23d 100644 --- a/conf/docker-aio/c8.dockerfile +++ b/conf/docker-aio/c8.dockerfile @@ -24,7 +24,7 @@ COPY disableipv6.conf /etc/sysctl.d/ RUN rm /etc/httpd/conf/* COPY httpd.conf /etc/httpd/conf RUN cd /opt ; tar zxf /tmp/dv/deps/solr-8.11.1dv.tgz -RUN cd /opt ; unzip /tmp/dv/deps/payara-6.2023.6.zip ; ln -s /opt/payara6 /opt/glassfish4 +RUN cd /opt ; unzip /tmp/dv/deps/payara-6.2023.7.zip ; ln -s /opt/payara6 /opt/glassfish4 # this copy of domain.xml is the result of running `asadmin set server.monitoring-service.module-monitoring-levels.jvm=LOW` on a default glassfish installation (aka - enable the glassfish REST monitir endpoint for the jvm` # this dies under Java 11, do we keep it? diff --git a/doc/sphinx-guides/source/developers/dev-environment.rst b/doc/sphinx-guides/source/developers/dev-environment.rst index 5520c645188..4b2163cfefa 100755 --- a/doc/sphinx-guides/source/developers/dev-environment.rst +++ b/doc/sphinx-guides/source/developers/dev-environment.rst @@ -89,15 +89,15 @@ On Linux, install ``jq`` from your package manager or download a binary from htt Install Payara ~~~~~~~~~~~~~~ -Payara 6.2023.6 or higher is required. +Payara 6.2023.7 or higher is required. To install Payara, run the following commands: ``cd /usr/local`` -``sudo curl -O -L https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/6.2023.6/payara-6.2023.6.zip`` +``sudo curl -O -L https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/6.2023.7/payara-6.2023.7.zip`` -``sudo unzip payara-6.2023.6.zip`` +``sudo unzip payara-6.2023.7.zip`` ``sudo chown -R $USER /usr/local/payara6`` diff --git a/doc/sphinx-guides/source/installation/prerequisites.rst b/doc/sphinx-guides/source/installation/prerequisites.rst index 15d5001d35d..b86bee9cd31 100644 --- a/doc/sphinx-guides/source/installation/prerequisites.rst +++ b/doc/sphinx-guides/source/installation/prerequisites.rst @@ -44,7 +44,7 @@ On RHEL/derivative you can make Java 11 the default with the ``alternatives`` co Payara ------ -Payara 6.2023.6 is recommended. Newer versions might work fine. Regular updates are recommended. +Payara 6.2023.7 is recommended. Newer versions might work fine. Regular updates are recommended. Installing Payara ================= @@ -55,8 +55,8 @@ Installing Payara - Download and install Payara (installed in ``/usr/local/payara6`` in the example commands below):: - # wget https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/6.2023.6/payara-6.2023.6.zip - # unzip payara-6.2023.6.zip + # wget https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/6.2023.7/payara-6.2023.7.zip + # unzip payara-6.2023.7.zip # mv payara6 /usr/local If nexus.payara.fish is ever down for maintenance, Payara distributions are also available from https://repo1.maven.org/maven2/fish/payara/distributions/payara/ diff --git a/downloads/download.sh b/downloads/download.sh index 4db4e7c5c8f..7ccff358820 100755 --- a/downloads/download.sh +++ b/downloads/download.sh @@ -1,5 +1,5 @@ #!/bin/sh -curl -L -O https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/6.2023.6/payara-6.2023.6.zip +curl -L -O https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/6.2023.7/payara-6.2023.7.zip curl -L -O https://archive.apache.org/dist/lucene/solr/8.11.1/solr-8.11.1.tgz curl -L -O https://search.maven.org/remotecontent?filepath=org/jboss/weld/weld-osgi-bundle/2.2.10.Final/weld-osgi-bundle-2.2.10.Final-glassfish4.jar curl -s -L http://sourceforge.net/projects/schemaspy/files/schemaspy/SchemaSpy%205.0.0/schemaSpy_5.0.0.jar/download > schemaSpy_5.0.0.jar diff --git a/modules/dataverse-parent/pom.xml b/modules/dataverse-parent/pom.xml index 5f1fbea87ec..84ea7f3d23b 100644 --- a/modules/dataverse-parent/pom.xml +++ b/modules/dataverse-parent/pom.xml @@ -148,7 +148,7 @@ -Duser.timezone=${project.timezone} -Dfile.encoding=${project.build.sourceEncoding} -Duser.language=${project.language} -Duser.region=${project.region} - 6.2023.6 + 6.2023.7 42.5.1 8.11.1 1.12.290 diff --git a/scripts/vagrant/setup.sh b/scripts/vagrant/setup.sh index c74865e61a8..b446e2dd5dc 100644 --- a/scripts/vagrant/setup.sh +++ b/scripts/vagrant/setup.sh @@ -51,7 +51,7 @@ SOLR_USER=solr echo "Ensuring Unix user '$SOLR_USER' exists" useradd $SOLR_USER || : DOWNLOAD_DIR='/dataverse/downloads' -PAYARA_ZIP="$DOWNLOAD_DIR/payara-6.2023.6.zip" +PAYARA_ZIP="$DOWNLOAD_DIR/payara-6.2023.7.zip" SOLR_TGZ="$DOWNLOAD_DIR/solr-8.11.1.tgz" if [ ! -f $PAYARA_ZIP ] || [ ! -f $SOLR_TGZ ]; then echo "Couldn't find $PAYARA_ZIP or $SOLR_TGZ! Running download script...." From 26e66d8cb5b4593db11bc09ddf7ae2e169f8a4e2 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Tue, 18 Jul 2023 23:37:05 +0200 Subject: [PATCH 029/173] build(deps): adapt payara api dep because of upstream BOM changes --- pom.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pom.xml b/pom.xml index 021077c4989..df8daa7e019 100644 --- a/pom.xml +++ b/pom.xml @@ -197,6 +197,9 @@ fish.payara.api payara-api provided + + ${payara.version} From c3021b80541f0375e8ed8725b7242201b976edb0 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Tue, 25 Jul 2023 15:53:20 -0400 Subject: [PATCH 030/173] update to payara6 #8305 --- scripts/installer/default.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/installer/default.config b/scripts/installer/default.config index 312dd2cb2d8..8647cd02416 100644 --- a/scripts/installer/default.config +++ b/scripts/installer/default.config @@ -1,7 +1,7 @@ [glassfish] HOST_DNS_ADDRESS = localhost GLASSFISH_USER = dataverse -GLASSFISH_DIRECTORY = /usr/local/payara5 +GLASSFISH_DIRECTORY = /usr/local/payara6 GLASSFISH_ADMIN_USER = admin GLASSFISH_ADMIN_PASSWORD = secret GLASSFISH_HEAP = 2048 From b627319d224df650b2a53a2b12720654c1806834 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Tue, 25 Jul 2023 15:54:13 -0400 Subject: [PATCH 031/173] get script working with postgres in a container, zsh #8305 --- scripts/dev/dev-rebuild.sh | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/scripts/dev/dev-rebuild.sh b/scripts/dev/dev-rebuild.sh index 9f296c6cc29..9eae195b135 100755 --- a/scripts/dev/dev-rebuild.sh +++ b/scripts/dev/dev-rebuild.sh @@ -3,6 +3,7 @@ PAYARA_DIR=/usr/local/payara6 ASADMIN=$PAYARA_DIR/glassfish/bin/asadmin DB_NAME=dvndb DB_USER=dvnapp +export PGPASSWORD=secret echo "Checking if there is a war file to undeploy..." LIST_APP=$($ASADMIN list-applications -t) @@ -23,7 +24,7 @@ echo "Deleting ALL DATA FILES uploaded to Dataverse..." rm -rf $PAYARA_DIR/glassfish/domains/domain1/files echo "Terminating database sessions so we can drop the database..." -psql -U postgres -c " +psql -h localhost -U postgres -c " SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = '$DB_NAME' @@ -31,14 +32,14 @@ WHERE pg_stat_activity.datname = '$DB_NAME' " template1 echo "Dropping the database..." -psql -U $DB_USER -c "DROP DATABASE \"$DB_NAME\"" template1 +psql -h localhost -U $DB_USER -c "DROP DATABASE \"$DB_NAME\"" template1 echo $? echo "Clearing out data from Solr..." -curl http://localhost:8983/solr/collection1/update/json?commit=true -H "Content-type: application/json" -X POST -d "{\"delete\": { \"query\":\"*:*\"}}" +curl "http://localhost:8983/solr/collection1/update/json?commit=true" -H "Content-type: application/json" -X POST -d "{\"delete\": { \"query\":\"*:*\"}}" echo "Creating a new database..." -psql -U $DB_USER -c "CREATE DATABASE \"$DB_NAME\" WITH OWNER = \"$DB_USER\"" template1 +psql -h localhost -U $DB_USER -c "CREATE DATABASE \"$DB_NAME\" WITH OWNER = \"$DB_USER\"" template1 echo $? echo "Starting app server..." @@ -53,7 +54,7 @@ cd scripts/api cd ../.. echo "Creating SQL sequence..." -psql -U $DB_USER $DB_NAME -f doc/sphinx-guides/source/_static/util/createsequence.sql +psql -h localhost -U $DB_USER $DB_NAME -f doc/sphinx-guides/source/_static/util/createsequence.sql echo "Setting DOI provider to \"FAKE\"..." curl http://localhost:8080/api/admin/settings/:DoiProvider -X PUT -d FAKE From da5193ffd3523a274feab8a083016b68e80202bd Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Wed, 26 Jul 2023 16:48:59 -0400 Subject: [PATCH 032/173] add workaround for FISH-7665: Payara doesn't run #8305 See https://github.com/payara/Payara/issues/6344 Bug Report: Payara doesn't run on latest JDK patch levels / FISH-7665 --- modules/container-base/src/main/docker/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/container-base/src/main/docker/Dockerfile b/modules/container-base/src/main/docker/Dockerfile index 148c29e0ed1..4e11e7835e6 100644 --- a/modules/container-base/src/main/docker/Dockerfile +++ b/modules/container-base/src/main/docker/Dockerfile @@ -75,6 +75,8 @@ WORKDIR / SHELL ["/bin/bash", "-euo", "pipefail", "-c"] # Mark these directories as mutuable data containers to avoid cluttering the images overlayfs at runtime. VOLUME ${STORAGE_DIR} ${SECRETS_DIR} ${DUMPS_DIR} +# Workaround for https://github.com/payara/Payara/issues/6344 +ENV JAVA_TOOL_OPTIONS="-Djdk.util.zip.disableZip64ExtraFieldValidation=true --add-opens=java.base/java.io=ALL-UNNAMED" RUN < Date: Thu, 27 Jul 2023 16:36:27 -0400 Subject: [PATCH 033/173] Revert "fix(sword): as of Payara 6, "attachment; " required to upload files #8305" This reverts commit 89182c1de0335a7a72079ee773504ca9d006f4aa. --- doc/release-notes/8305-payara6.md | 3 --- doc/sphinx-guides/source/api/sword.rst | 6 +----- .../api/datadeposit/SWORDv2MediaResourceServlet.java | 4 ---- src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java | 4 ++-- 4 files changed, 3 insertions(+), 14 deletions(-) delete mode 100644 doc/release-notes/8305-payara6.md diff --git a/doc/release-notes/8305-payara6.md b/doc/release-notes/8305-payara6.md deleted file mode 100644 index 9e197f07e98..00000000000 --- a/doc/release-notes/8305-payara6.md +++ /dev/null @@ -1,3 +0,0 @@ -## Backward Incompatible Changes - -- To upload files, the SWORD API now requires "Content-Disposition: attachment; filename=example.zip" rather than "Content-Disposition: filename=example.zip". diff --git a/doc/sphinx-guides/source/api/sword.rst b/doc/sphinx-guides/source/api/sword.rst index 7be1f3ffc16..11b43e98774 100755 --- a/doc/sphinx-guides/source/api/sword.rst +++ b/doc/sphinx-guides/source/api/sword.rst @@ -67,8 +67,6 @@ Differences in Dataverse Software 4 from DVN 3.x lead to a few minor backward in - As of Dataverse Software 5.10, ``NONE`` is no longer supported as a license. -- As of Dataverse Software 6.0, when uploading files, you must supply "Content-Disposition: attachment; filename=example.zip" rather than "Content-Disposition: filename=example.zip". See :ref:`sword-add-files`. - New features as of v1.1 ----------------------- @@ -163,8 +161,6 @@ You must have permission to add datasets in a Dataverse collection (the Datavers curl -u $API_TOKEN: https://$HOSTNAME/dvn/api/data-deposit/v1.1/swordv2/collection/dataverse/$DATAVERSE_ALIAS -.. _sword-add-files: - Add files to a dataset with a zip file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -172,7 +168,7 @@ You must have ``EditDataset`` permission (Contributor role or above such as Cura .. code-block:: bash - curl -u $API_TOKEN: --data-binary @path/to/example.zip -H "Content-Disposition: attachment; filename=example.zip" -H "Content-Type: application/zip" -H "Packaging: http://purl.org/net/sword/package/SimpleZip" https://$HOSTNAME/dvn/api/data-deposit/v1.1/swordv2/edit-media/study/doi:TEST/12345 + curl -u $API_TOKEN: --data-binary @path/to/example.zip -H "Content-Disposition: filename=example.zip" -H "Content-Type: application/zip" -H "Packaging: http://purl.org/net/sword/package/SimpleZip" https://$HOSTNAME/dvn/api/data-deposit/v1.1/swordv2/edit-media/study/doi:TEST/12345 Display a dataset atom entry ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SWORDv2MediaResourceServlet.java b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SWORDv2MediaResourceServlet.java index 0cea1b80571..245ab6ab23b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SWORDv2MediaResourceServlet.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SWORDv2MediaResourceServlet.java @@ -61,10 +61,6 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S try { lock.lock(); mediaResourceManagerImpl.setHttpRequest(req); - // Under Payara 5 we could send "Content-Disposition: filename=example.zip" - // Under Payara 6 now must send "Content-Disposition: attachment; filename=example.zip" - // Otherwise we get "Filename could not be extracted from Content-Disposition: Expected separator ';' instead of '='" - // Use req.getHeader("Content-Disposition") to see what the client is sending. this.api.post(req, resp); mediaResourceManagerImpl.setHttpRequest(null); } finally { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java index a19f251b065..5f61ab3f2c7 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -648,7 +648,7 @@ public static Response uploadFile(String persistentId, String zipfilename, Strin Response swordStatementResponse = given() .body(bytes) .header("Packaging", "http://purl.org/net/sword/package/SimpleZip") - .header("Content-Disposition", "attachment; filename=" + zipfilename) + .header("Content-Disposition", "filename=" + zipfilename) /** * It's unclear why we need to add "preemptive" to auth but * without it we can't use send bytes using the body/content @@ -675,7 +675,7 @@ public static Response uploadZipFileViaSword(String persistentId, String pathToZ Response swordStatementResponse = given() .body(bytes) .header("Packaging", "http://purl.org/net/sword/package/SimpleZip") - .header("Content-Disposition", "attachment; filename=" + zipfilename) + .header("Content-Disposition", "filename=" + zipfilename) /** * It's unclear why we need to add "preemptive" to auth but * without it we can't use send bytes using the body/content From 0221006d75b286e8ed16ba8021d2d42a21b85b6c Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Fri, 28 Jul 2023 16:00:05 -0400 Subject: [PATCH 034/173] backward compatible SWORD upload on Payara 6 #8305 As of Payara 6, you can no longer send "Content-Disposition: filename=example.zip" Instead you must send "Content-Disposition: attachment; filename=example.zip" For backward compatibility, we are adding "attachment; " if it's missing. An alternative would be to force this backward incompatibility on our users. Originally we did this in 89182c1 but we reverted it in 83c55a9 --- .../api/datadeposit/SwordFilter.java | 48 +++++++++++++++++++ src/main/webapp/WEB-INF/web.xml | 8 ++++ 2 files changed, 56 insertions(+) create mode 100644 src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SwordFilter.java diff --git a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SwordFilter.java b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SwordFilter.java new file mode 100644 index 00000000000..6e5335668f9 --- /dev/null +++ b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SwordFilter.java @@ -0,0 +1,48 @@ +package edu.harvard.iq.dataverse.api.datadeposit; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; +import java.io.IOException; + +public class SwordFilter implements jakarta.servlet.Filter { + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + HttpServletRequest req = (HttpServletRequest) request; + MutateHeaders requestWrapper = new MutateHeaders(req); + chain.doFilter(requestWrapper, response); + } + + /** + * We are mutating headers because Payara 6 is more strict than Paraya 5 and + * wants "attachment; filename=" instead of just "filename=". In order to + * not break backward compatibility, we add "attachment; " for our (SWORD) + * API users. (This only seem to affect our SWORD API.) That is, the can + * continue to send '-H "Content-Disposition: filename=example.zip"' as + * we've documented for years. + */ + public class MutateHeaders extends HttpServletRequestWrapper { + + public MutateHeaders(HttpServletRequest request) { + super(request); + } + + // inspired by https://stackoverflow.com/questions/2811769/adding-an-http-header-to-the-request-in-a-servlet-filter/2811841#2811841 + @Override + public String getHeader(String name) { + String header = super.getHeader(name); + if ("Content-Disposition".equalsIgnoreCase(name)) { + if (header.startsWith("filename=")) { + header = header.replaceFirst("filename=", "attachment; filename="); + } + } + return (header != null) ? header : super.getParameter(name); + } + + } + +} diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 69d3218e38e..f16da2c8e5b 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -268,5 +268,13 @@ edu.harvard.iq.dataverse.api.datadeposit.SWORDv2ContainerServlet /dvn/api/data-deposit/v1.1/swordv2/edit/* + + edu.harvard.iq.dataverse.api.datadeposit.SwordFilter + edu.harvard.iq.dataverse.api.datadeposit.SwordFilter + + + edu.harvard.iq.dataverse.api.datadeposit.SwordFilter + /dvn/api/data-deposit/v1.1/swordv2/edit-media/* + From 8efb96487d181f83726ac5a338a13692b1710850 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Tue, 1 Aug 2023 16:45:04 -0400 Subject: [PATCH 035/173] use com.sun.aas.instanceRoot to find logs dir #8305 HarvestingClientsIT#testHarvestingClientRun was failing when Dataverse is running in Docker --- .../iq/dataverse/harvest/client/HarvesterServiceBean.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/harvest/client/HarvesterServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/harvest/client/HarvesterServiceBean.java index 8e80fcb78bf..20884e3360c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/harvest/client/HarvesterServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/harvest/client/HarvesterServiceBean.java @@ -148,12 +148,12 @@ public void doHarvest(DataverseRequest dataverseRequest, Long harvestingClientId String logTimestamp = logFormatter.format(new Date()); Logger hdLogger = Logger.getLogger("edu.harvard.iq.dataverse.harvest.client.HarvesterServiceBean." + harvestingClientConfig.getName() + logTimestamp); - String logFileName = "../logs" + File.separator + "harvest_" + harvestingClientConfig.getName() + "_" + logTimestamp + ".log"; + String logFileName = System.getProperty("com.sun.aas.instanceRoot") + File.separator + "logs" + File.separator + "harvest_" + harvestingClientConfig.getName() + "_" + logTimestamp + ".log"; FileHandler fileHandler = new FileHandler(logFileName); hdLogger.setUseParentHandlers(false); hdLogger.addHandler(fileHandler); - PrintWriter importCleanupLog = new PrintWriter(new FileWriter( "../logs/harvest_cleanup_" + harvestingClientConfig.getName() + "_" + logTimestamp+".txt")); + PrintWriter importCleanupLog = new PrintWriter(new FileWriter(System.getProperty("com.sun.aas.instanceRoot") + File.separator + "logs/harvest_cleanup_" + harvestingClientConfig.getName() + "_" + logTimestamp + ".txt")); List harvestedDatasetIds = new ArrayList<>(); From b829ca7a7802441845ef0ea6d878bde7c3651a2e Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Wed, 2 Aug 2023 17:07:15 -0400 Subject: [PATCH 036/173] remove Perl installer, docker-aio, docker-dcm #8305 Also mark DCM and RSAL as deprecated #8985 --- .github/workflows/cypress_ui.yml.future | 3 +- .github/workflows/shellcheck.yml | 1 - .gitignore | 14 - conf/docker-aio/0prep_deps.sh | 19 - conf/docker-aio/1prep.sh | 39 - conf/docker-aio/c8.dockerfile | 87 - conf/docker-aio/configure_doi.bash | 24 - conf/docker-aio/disableipv6.conf | 1 - conf/docker-aio/domain-restmonitor.xml | 486 ------ conf/docker-aio/dv/install/default.config | 15 - conf/docker-aio/dv/pg_hba.conf | 91 - conf/docker-aio/entrypoint.bash | 16 - conf/docker-aio/httpd.conf | 27 - conf/docker-aio/install.bash | 10 - conf/docker-aio/prep_it.bash | 55 - conf/docker-aio/readme.md | 64 - conf/docker-aio/run-test-suite.sh | 13 - conf/docker-aio/setupIT.bash | 13 - conf/docker-aio/seturl.bash | 3 - conf/docker-aio/testdata/httpd.conf | 27 - conf/docker-aio/testscripts/db.sh | 3 - conf/docker-aio/testscripts/install | 21 - conf/docker-aio/testscripts/post | 15 - conf/docker-dcm/.gitignore | 2 - conf/docker-dcm/0prep.sh | 11 - conf/docker-dcm/c6client.dockerfile | 7 - conf/docker-dcm/cfg/dcm/bashrc | 18 - conf/docker-dcm/cfg/dcm/entrypoint-dcm.sh | 6 - conf/docker-dcm/cfg/dcm/healthcheck-dcm.sh | 14 - conf/docker-dcm/cfg/dcm/rq-init-d | 57 - conf/docker-dcm/cfg/dcm/test_install.sh | 7 - conf/docker-dcm/cfg/rsal/entrypoint-rsal.sh | 5 - .../docker-dcm/cfg/rsal/lighttpd-modules.conf | 174 -- conf/docker-dcm/cfg/rsal/lighttpd.conf | 43 - conf/docker-dcm/cfg/rsal/rsyncd.conf | 8 - conf/docker-dcm/configure_dcm.sh | 26 - conf/docker-dcm/configure_rsal.sh | 21 - conf/docker-dcm/create.bash | 22 - conf/docker-dcm/dataset.json | 126 -- conf/docker-dcm/dcmsrv.dockerfile | 21 - conf/docker-dcm/docker-compose.yml | 50 - conf/docker-dcm/dv0dcm.dockerfile | 7 - conf/docker-dcm/get_transfer.bash | 19 - conf/docker-dcm/publish_major.bash | 17 - conf/docker-dcm/readme.md | 26 - conf/docker-dcm/rsal-workflow2.json | 31 - conf/docker-dcm/rsalsrv.dockerfile | 20 - conf/docker-dcm/site-primary.json | 6 - conf/docker-dcm/site-remote.json | 6 - .../source/admin/metadatacustomization.rst | 2 +- .../source/developers/big-data-support.rst | 99 +- .../source/developers/containers.rst | 5 - .../source/developers/testing.rst | 7 +- doc/sphinx-guides/source/developers/tools.rst | 2 +- scripts/installer/README.txt | 43 +- scripts/installer/install | 1538 ----------------- tests/run_docker_dataverse.sh | 4 - 57 files changed, 9 insertions(+), 3488 deletions(-) delete mode 100755 conf/docker-aio/0prep_deps.sh delete mode 100755 conf/docker-aio/1prep.sh delete mode 100644 conf/docker-aio/c8.dockerfile delete mode 100755 conf/docker-aio/configure_doi.bash delete mode 100644 conf/docker-aio/disableipv6.conf delete mode 100644 conf/docker-aio/domain-restmonitor.xml delete mode 100644 conf/docker-aio/dv/install/default.config delete mode 100644 conf/docker-aio/dv/pg_hba.conf delete mode 100755 conf/docker-aio/entrypoint.bash delete mode 100644 conf/docker-aio/httpd.conf delete mode 100755 conf/docker-aio/install.bash delete mode 100755 conf/docker-aio/prep_it.bash delete mode 100644 conf/docker-aio/readme.md delete mode 100755 conf/docker-aio/run-test-suite.sh delete mode 100755 conf/docker-aio/setupIT.bash delete mode 100755 conf/docker-aio/seturl.bash delete mode 100644 conf/docker-aio/testdata/httpd.conf delete mode 100755 conf/docker-aio/testscripts/db.sh delete mode 100755 conf/docker-aio/testscripts/install delete mode 100755 conf/docker-aio/testscripts/post delete mode 100644 conf/docker-dcm/.gitignore delete mode 100755 conf/docker-dcm/0prep.sh delete mode 100644 conf/docker-dcm/c6client.dockerfile delete mode 100644 conf/docker-dcm/cfg/dcm/bashrc delete mode 100755 conf/docker-dcm/cfg/dcm/entrypoint-dcm.sh delete mode 100755 conf/docker-dcm/cfg/dcm/healthcheck-dcm.sh delete mode 100755 conf/docker-dcm/cfg/dcm/rq-init-d delete mode 100755 conf/docker-dcm/cfg/dcm/test_install.sh delete mode 100755 conf/docker-dcm/cfg/rsal/entrypoint-rsal.sh delete mode 100644 conf/docker-dcm/cfg/rsal/lighttpd-modules.conf delete mode 100644 conf/docker-dcm/cfg/rsal/lighttpd.conf delete mode 100644 conf/docker-dcm/cfg/rsal/rsyncd.conf delete mode 100755 conf/docker-dcm/configure_dcm.sh delete mode 100755 conf/docker-dcm/configure_rsal.sh delete mode 100755 conf/docker-dcm/create.bash delete mode 100644 conf/docker-dcm/dataset.json delete mode 100644 conf/docker-dcm/dcmsrv.dockerfile delete mode 100644 conf/docker-dcm/docker-compose.yml delete mode 100644 conf/docker-dcm/dv0dcm.dockerfile delete mode 100755 conf/docker-dcm/get_transfer.bash delete mode 100755 conf/docker-dcm/publish_major.bash delete mode 100644 conf/docker-dcm/readme.md delete mode 100644 conf/docker-dcm/rsal-workflow2.json delete mode 100644 conf/docker-dcm/rsalsrv.dockerfile delete mode 100644 conf/docker-dcm/site-primary.json delete mode 100644 conf/docker-dcm/site-remote.json delete mode 100755 scripts/installer/install delete mode 100644 tests/run_docker_dataverse.sh diff --git a/.github/workflows/cypress_ui.yml.future b/.github/workflows/cypress_ui.yml.future index b38ae2f9558..0823233fdeb 100644 --- a/.github/workflows/cypress_ui.yml.future +++ b/.github/workflows/cypress_ui.yml.future @@ -2,6 +2,7 @@ # # THIS IS AN OLD TRAVIS-CI.ORG JOB FILE # To be used with Github Actions, it would be necessary to refactor it. +# In addition, it needs to be rewritten to use our modern containers. # Keeping it as the future example it has been before. # See also #5846 # @@ -30,8 +31,6 @@ jobs: directories: # we also need to cache folder with Cypress binary - ~/.cache - # we want to cache the Glassfish and Solr dependencies as well - - conf/docker-aio/dv/deps before_install: - cd tests install: diff --git a/.github/workflows/shellcheck.yml b/.github/workflows/shellcheck.yml index 94ba041e135..dc0d19914a1 100644 --- a/.github/workflows/shellcheck.yml +++ b/.github/workflows/shellcheck.yml @@ -33,7 +33,6 @@ jobs: # Exclude old scripts exclude: | */.git/* - conf/docker-aio/* doc/* downloads/* scripts/database/* diff --git a/.gitignore b/.gitignore index d38538fc364..5a2da73fb2c 100644 --- a/.gitignore +++ b/.gitignore @@ -39,17 +39,6 @@ scripts/api/setup-all.*.log # ctags generated tag file tags -# dependencies I'm not sure we're allowed to redistribute / have in version control -conf/docker-aio/dv/deps/ - -# no need to check aoi installer zip into vc -conf/docker-aio/dv/install/dvinstall.zip -# or copy of test data -conf/docker-aio/testdata/ - -# docker-aio creates maven/ which reports 86 new files. ignore this wd. -maven/ - scripts/installer/default.config *.pem @@ -71,8 +60,5 @@ scripts/search/data/binary/trees.png.thumb140 src/main/webapp/resources/images/cc0.png.thumb140 src/main/webapp/resources/images/dataverseproject.png.thumb140 -# apache-maven is downloaded by docker-aio -apache-maven* - # Docker development volumes /docker-dev-volumes diff --git a/conf/docker-aio/0prep_deps.sh b/conf/docker-aio/0prep_deps.sh deleted file mode 100755 index bee8f09e9f5..00000000000 --- a/conf/docker-aio/0prep_deps.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh -if [ ! -d dv/deps ]; then - mkdir -p dv/deps -fi -wdir=`pwd` - -if [ ! -e dv/deps/payara-6.2023.7.zip ]; then - echo "payara dependency prep" - wget https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/6.2023.7/payara-6.2023.7.zip -O dv/deps/payara-6.2023.7.zip -fi - -if [ ! -e dv/deps/solr-8.11.1dv.tgz ]; then - echo "solr dependency prep" - # schema changes *should* be the only ones... - cd dv/deps/ - wget https://archive.apache.org/dist/lucene/solr/8.11.1/solr-8.11.1.tgz -O solr-8.11.1dv.tgz - cd ../../ -fi - diff --git a/conf/docker-aio/1prep.sh b/conf/docker-aio/1prep.sh deleted file mode 100755 index 508d41d93ff..00000000000 --- a/conf/docker-aio/1prep.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash - -# move things necessary for integration tests into build context. -# this was based off the phoenix deployment; and is likely uglier and bulkier than necessary in a perfect world - -mkdir -p testdata/doc/sphinx-guides/source/_static/util/ -cp ../solr/8.11.1/schema*.xml testdata/ -cp ../solr/8.11.1/solrconfig.xml testdata/ -cp ../jhove/jhove.conf testdata/ -cp ../jhove/jhoveConfig.xsd testdata/ -cd ../../ -cp -r scripts conf/docker-aio/testdata/ -cp doc/sphinx-guides/source/_static/util/createsequence.sql conf/docker-aio/testdata/doc/sphinx-guides/source/_static/util/ - -wget -q https://downloads.apache.org/maven/maven-3/3.8.5/binaries/apache-maven-3.8.5-bin.tar.gz -tar xfz apache-maven-3.8.5-bin.tar.gz -mkdir maven -mv apache-maven-3.8.5/* maven/ -echo "export JAVA_HOME=/usr/lib/jvm/jre-openjdk" > maven/maven.sh -echo "export M2_HOME=../maven" >> maven/maven.sh -echo "export MAVEN_HOME=../maven" >> maven/maven.sh -echo "export PATH=../maven/bin:${PATH}" >> maven/maven.sh -chmod 0755 maven/maven.sh - -# not using dvinstall.zip for setupIT.bash; but still used in install.bash for normal ops -source maven/maven.sh && mvn clean -./scripts/installer/custom-build-number -source maven/maven.sh && mvn package -cd scripts/installer -make clean -make -mkdir -p ../../conf/docker-aio/dv/install -cp dvinstall.zip ../../conf/docker-aio/dv/install/ - -# ITs sometimes need files server-side -# yes, these copies could be avoided by moving the build root here. but the build -# context is already big enough that it seems worth avoiding. -cd ../../ -cp src/test/java/edu/harvard/iq/dataverse/makedatacount/sushi_sample_logs.json conf/docker-aio/testdata/ diff --git a/conf/docker-aio/c8.dockerfile b/conf/docker-aio/c8.dockerfile deleted file mode 100644 index 9f20ae0a23d..00000000000 --- a/conf/docker-aio/c8.dockerfile +++ /dev/null @@ -1,87 +0,0 @@ -FROM rockylinux/rockylinux:latest -# OS dependencies -# IQSS now recommends Postgres 13. -RUN dnf -qy module disable postgresql -RUN yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm - -RUN echo "fastestmirror=true" >> /etc/dnf/dnf.conf -RUN yum install -y java-11-openjdk-devel postgresql13-server sudo epel-release unzip curl httpd python2 diffutils -RUN yum install -y jq lsof awscli - -# for older search scripts -RUN ln -s /usr/bin/python2 /usr/bin/python - -# copy and unpack dependencies (solr, payara) -COPY dv /tmp/dv -COPY testdata/schema*.xml /tmp/dv/ -COPY testdata/solrconfig.xml /tmp/dv - -# ITs need files -COPY testdata/sushi_sample_logs.json /tmp/ - -# IPv6 and localhost appears to be related to some of the intermittant connection issues -COPY disableipv6.conf /etc/sysctl.d/ -RUN rm /etc/httpd/conf/* -COPY httpd.conf /etc/httpd/conf -RUN cd /opt ; tar zxf /tmp/dv/deps/solr-8.11.1dv.tgz -RUN cd /opt ; unzip /tmp/dv/deps/payara-6.2023.7.zip ; ln -s /opt/payara6 /opt/glassfish4 - -# this copy of domain.xml is the result of running `asadmin set server.monitoring-service.module-monitoring-levels.jvm=LOW` on a default glassfish installation (aka - enable the glassfish REST monitir endpoint for the jvm` -# this dies under Java 11, do we keep it? -#COPY domain-restmonitor.xml /opt/payara6/glassfish/domains/domain1/config/domain.xml - -RUN sudo -u postgres /usr/pgsql-13/bin/initdb -D /var/lib/pgsql/13/data -E 'UTF-8' - -# copy configuration related files -RUN cp /tmp/dv/pg_hba.conf /var/lib/pgsql/13/data/ -RUN cp -r /opt/solr-8.11.1/server/solr/configsets/_default /opt/solr-8.11.1/server/solr/collection1 -RUN cp /tmp/dv/schema*.xml /opt/solr-8.11.1/server/solr/collection1/conf/ -RUN cp /tmp/dv/solrconfig.xml /opt/solr-8.11.1/server/solr/collection1/conf/solrconfig.xml - -# skipping payara user and solr user (run both as root) - -#solr port -EXPOSE 8983 - -# postgres port -EXPOSE 5432 - -# payara port -EXPOSE 8080 - -# apache port, http -EXPOSE 80 - -# debugger ports (jmx,jdb) -EXPOSE 8686 -EXPOSE 9009 - -RUN mkdir /opt/dv - -# keeping the symlink on the off chance that something else is still assuming /usr/local/glassfish4 -RUN ln -s /opt/payara6 /usr/local/glassfish4 -COPY dv/install/ /opt/dv/ -COPY install.bash /opt/dv/ -COPY entrypoint.bash /opt/dv/ -COPY testdata /opt/dv/testdata -COPY testscripts/* /opt/dv/testdata/ -COPY setupIT.bash /opt/dv -WORKDIR /opt/dv - -# need to take DOI provider info from build args as of ec377d2a4e27424db8815c55ce544deee48fc5e0 -# Default to EZID; use built-args to switch to DataCite (or potentially handles) -#ARG DoiProvider=EZID -ARG DoiProvider=FAKE -ARG doi_baseurl=https://ezid.cdlib.org -ARG doi_username=apitest -ARG doi_password=apitest -ENV DoiProvider=${DoiProvider} -ENV doi_baseurl=${doi_baseurl} -ENV doi_username=${doi_username} -ENV doi_password=${doi_password} -COPY configure_doi.bash /opt/dv - -# healthcheck for payara only (assumes modified domain.xml); -# does not check dataverse application status. -HEALTHCHECK CMD curl --fail http://localhost:4848/monitoring/domain/server.json || exit 1 -CMD ["/opt/dv/entrypoint.bash"] diff --git a/conf/docker-aio/configure_doi.bash b/conf/docker-aio/configure_doi.bash deleted file mode 100755 index ce11ca48ce9..00000000000 --- a/conf/docker-aio/configure_doi.bash +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env bash - -cd /opt/payara6 - -# if appropriate; reconfigure PID provider on the basis of environmental variables. -if [ ! -z "${DoiProvider}" ]; then - curl -X PUT -d ${DoiProvider} http://localhost:8080/api/admin/settings/:DoiProvider -fi -if [ ! -z "${doi_username}" ]; then - bin/asadmin create-jvm-options "-Ddoi.username=${doi_username}" -fi -if [ ! -z "${doi_password}" ]; then - bin/asadmin create-jvm-options "-Ddoi.password=${doi_password}" -fi -if [ ! -z "${doi_baseurl}" ]; then - bin/asadmin delete-jvm-options "-Ddoi.baseurlstring=https\://mds.test.datacite.org" - doi_baseurl_esc=`echo ${doi_baseurl} | sed -e 's/:/\\\:/'` - bin/asadmin create-jvm-options "-Ddoi.baseurlstring=${doi_baseurl_esc}" -fi -if [ ! -z "${doi_dataciterestapiurl}" ]; then - bin/asadmin delete-jvm-options "-Ddoi.dataciterestapiurlstring=https\://api.test.datacite.org" - doi_dataciterestapiurl_esc=`echo ${doi_dataciterestapiurl} | sed -e 's/:/\\\:/'` - bin/asadmin create-jvm-options "-Ddoi.dataciterestapiurlstring=${doi_dataciterestapiurl_esc}" -fi diff --git a/conf/docker-aio/disableipv6.conf b/conf/docker-aio/disableipv6.conf deleted file mode 100644 index 8d425183e3f..00000000000 --- a/conf/docker-aio/disableipv6.conf +++ /dev/null @@ -1 +0,0 @@ -net.ipv6.conf.all.disable_ipv6 = 1 diff --git a/conf/docker-aio/domain-restmonitor.xml b/conf/docker-aio/domain-restmonitor.xml deleted file mode 100644 index a18a88ab011..00000000000 --- a/conf/docker-aio/domain-restmonitor.xml +++ /dev/null @@ -1,486 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -XX:MaxPermSize=192m - -client - -Djava.awt.headless=true - -Djdk.corba.allowOutputStreamSubclass=true - -Djavax.xml.accessExternalSchema=all - -Djavax.management.builder.initial=com.sun.enterprise.v3.admin.AppServerMBeanServerBuilder - -XX:+UnlockDiagnosticVMOptions - -Djava.endorsed.dirs=${com.sun.aas.installRoot}/modules/endorsed${path.separator}${com.sun.aas.installRoot}/lib/endorsed - -Djava.security.policy=${com.sun.aas.instanceRoot}/config/server.policy - -Djava.security.auth.login.config=${com.sun.aas.instanceRoot}/config/login.conf - -Dcom.sun.enterprise.security.httpsOutboundKeyAlias=s1as - -Xmx512m - -Djavax.net.ssl.keyStore=${com.sun.aas.instanceRoot}/config/keystore.jks - -Djavax.net.ssl.trustStore=${com.sun.aas.instanceRoot}/config/cacerts.jks - -Djava.ext.dirs=${com.sun.aas.javaRoot}/lib/ext${path.separator}${com.sun.aas.javaRoot}/jre/lib/ext${path.separator}${com.sun.aas.instanceRoot}/lib/ext - -Djdbc.drivers=org.apache.derby.jdbc.ClientDriver - -DANTLR_USE_DIRECT_CLASS_LOADING=true - -Dcom.sun.enterprise.config.config_environment_factory_class=com.sun.enterprise.config.serverbeans.AppserverConfigEnvironmentFactory - - -Dorg.glassfish.additionalOSGiBundlesToStart=org.apache.felix.shell,org.apache.felix.gogo.runtime,org.apache.felix.gogo.shell,org.apache.felix.gogo.command,org.apache.felix.shell.remote,org.apache.felix.fileinstall - - - -Dosgi.shell.telnet.port=6666 - - -Dosgi.shell.telnet.maxconn=1 - - -Dosgi.shell.telnet.ip=127.0.0.1 - - -Dgosh.args=--nointeractive - - -Dfelix.fileinstall.dir=${com.sun.aas.installRoot}/modules/autostart/ - - -Dfelix.fileinstall.poll=5000 - - -Dfelix.fileinstall.log.level=2 - - -Dfelix.fileinstall.bundles.new.start=true - - -Dfelix.fileinstall.bundles.startTransient=true - - -Dfelix.fileinstall.disableConfigSave=false - - -XX:NewRatio=2 - - -Dcom.ctc.wstx.returnNullForDefaultNamespace=true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -XX:MaxPermSize=192m - -server - -Djava.awt.headless=true - -Djdk.corba.allowOutputStreamSubclass=true - -XX:+UnlockDiagnosticVMOptions - -Djava.endorsed.dirs=${com.sun.aas.installRoot}/modules/endorsed${path.separator}${com.sun.aas.installRoot}/lib/endorsed - -Djava.security.policy=${com.sun.aas.instanceRoot}/config/server.policy - -Djava.security.auth.login.config=${com.sun.aas.instanceRoot}/config/login.conf - -Dcom.sun.enterprise.security.httpsOutboundKeyAlias=s1as - -Djavax.net.ssl.keyStore=${com.sun.aas.instanceRoot}/config/keystore.jks - -Djavax.net.ssl.trustStore=${com.sun.aas.instanceRoot}/config/cacerts.jks - -Djava.ext.dirs=${com.sun.aas.javaRoot}/lib/ext${path.separator}${com.sun.aas.javaRoot}/jre/lib/ext${path.separator}${com.sun.aas.instanceRoot}/lib/ext - -Djdbc.drivers=org.apache.derby.jdbc.ClientDriver - -DANTLR_USE_DIRECT_CLASS_LOADING=true - -Dcom.sun.enterprise.config.config_environment_factory_class=com.sun.enterprise.config.serverbeans.AppserverConfigEnvironmentFactory - -XX:NewRatio=2 - -Xmx512m - - -Dorg.glassfish.additionalOSGiBundlesToStart=org.apache.felix.shell,org.apache.felix.gogo.runtime,org.apache.felix.gogo.shell,org.apache.felix.gogo.command,org.apache.felix.fileinstall - - -Dosgi.shell.telnet.port=${OSGI_SHELL_TELNET_PORT} - - -Dosgi.shell.telnet.maxconn=1 - - -Dosgi.shell.telnet.ip=127.0.0.1 - - -Dgosh.args=--noshutdown -c noop=true - - -Dfelix.fileinstall.dir=${com.sun.aas.installRoot}/modules/autostart/ - - -Dfelix.fileinstall.poll=5000 - - -Dfelix.fileinstall.log.level=3 - - -Dfelix.fileinstall.bundles.new.start=true - - -Dfelix.fileinstall.bundles.startTransient=true - - -Dfelix.fileinstall.disableConfigSave=false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/conf/docker-aio/dv/install/default.config b/conf/docker-aio/dv/install/default.config deleted file mode 100644 index 0b806a8714b..00000000000 --- a/conf/docker-aio/dv/install/default.config +++ /dev/null @@ -1,15 +0,0 @@ -HOST_DNS_ADDRESS localhost -GLASSFISH_DIRECTORY /opt/glassfish4 -ADMIN_EMAIL -MAIL_SERVER mail.hmdc.harvard.edu -POSTGRES_ADMIN_PASSWORD secret -POSTGRES_SERVER db -POSTGRES_PORT 5432 -POSTGRES_DATABASE dvndb -POSTGRES_USER dvnapp -POSTGRES_PASSWORD secret -SOLR_LOCATION idx -RSERVE_HOST localhost -RSERVE_PORT 6311 -RSERVE_USER rserve -RSERVE_PASSWORD rserve diff --git a/conf/docker-aio/dv/pg_hba.conf b/conf/docker-aio/dv/pg_hba.conf deleted file mode 100644 index 77feba5247d..00000000000 --- a/conf/docker-aio/dv/pg_hba.conf +++ /dev/null @@ -1,91 +0,0 @@ -# PostgreSQL Client Authentication Configuration File -# =================================================== -# -# Refer to the "Client Authentication" section in the PostgreSQL -# documentation for a complete description of this file. A short -# synopsis follows. -# -# This file controls: which hosts are allowed to connect, how clients -# are authenticated, which PostgreSQL user names they can use, which -# databases they can access. Records take one of these forms: -# -# local DATABASE USER METHOD [OPTIONS] -# host DATABASE USER ADDRESS METHOD [OPTIONS] -# hostssl DATABASE USER ADDRESS METHOD [OPTIONS] -# hostnossl DATABASE USER ADDRESS METHOD [OPTIONS] -# -# (The uppercase items must be replaced by actual values.) -# -# The first field is the connection type: "local" is a Unix-domain -# socket, "host" is either a plain or SSL-encrypted TCP/IP socket, -# "hostssl" is an SSL-encrypted TCP/IP socket, and "hostnossl" is a -# plain TCP/IP socket. -# -# DATABASE can be "all", "sameuser", "samerole", "replication", a -# database name, or a comma-separated list thereof. The "all" -# keyword does not match "replication". Access to replication -# must be enabled in a separate record (see example below). -# -# USER can be "all", a user name, a group name prefixed with "+", or a -# comma-separated list thereof. In both the DATABASE and USER fields -# you can also write a file name prefixed with "@" to include names -# from a separate file. -# -# ADDRESS specifies the set of hosts the record matches. It can be a -# host name, or it is made up of an IP address and a CIDR mask that is -# an integer (between 0 and 32 (IPv4) or 128 (IPv6) inclusive) that -# specifies the number of significant bits in the mask. A host name -# that starts with a dot (.) matches a suffix of the actual host name. -# Alternatively, you can write an IP address and netmask in separate -# columns to specify the set of hosts. Instead of a CIDR-address, you -# can write "samehost" to match any of the server's own IP addresses, -# or "samenet" to match any address in any subnet that the server is -# directly connected to. -# -# METHOD can be "trust", "reject", "md5", "password", "gss", "sspi", -# "krb5", "ident", "peer", "pam", "ldap", "radius" or "cert". Note that -# "password" sends passwords in clear text; "md5" is preferred since -# it sends encrypted passwords. -# -# OPTIONS are a set of options for the authentication in the format -# NAME=VALUE. The available options depend on the different -# authentication methods -- refer to the "Client Authentication" -# section in the documentation for a list of which options are -# available for which authentication methods. -# -# Database and user names containing spaces, commas, quotes and other -# special characters must be quoted. Quoting one of the keywords -# "all", "sameuser", "samerole" or "replication" makes the name lose -# its special character, and just match a database or username with -# that name. -# -# This file is read on server startup and when the postmaster receives -# a SIGHUP signal. If you edit the file on a running system, you have -# to SIGHUP the postmaster for the changes to take effect. You can -# use "pg_ctl reload" to do that. - -# Put your actual configuration here -# ---------------------------------- -# -# If you want to allow non-local connections, you need to add more -# "host" records. In that case you will also need to make PostgreSQL -# listen on a non-local interface via the listen_addresses -# configuration parameter, or via the -i or -h command line switches. - - - -# TYPE DATABASE USER ADDRESS METHOD - -# "local" is for Unix domain socket connections only -#local all all peer -local all all trust -# IPv4 local connections: -#host all all 127.0.0.1/32 trust -host all all 0.0.0.0/0 trust -# IPv6 local connections: -host all all ::1/128 trust -# Allow replication connections from localhost, by a user with the -# replication privilege. -#local replication postgres peer -#host replication postgres 127.0.0.1/32 ident -#host replication postgres ::1/128 ident diff --git a/conf/docker-aio/entrypoint.bash b/conf/docker-aio/entrypoint.bash deleted file mode 100755 index 0d74981c527..00000000000 --- a/conf/docker-aio/entrypoint.bash +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash -export LANG=en_US.UTF-8 -sudo -u postgres /usr/pgsql-13/bin/pg_ctl start -D /var/lib/pgsql/13/data & -cd /opt/solr-8.11.1/ -# TODO: Run Solr as non-root and remove "-force". -bin/solr start -force -bin/solr create_core -c collection1 -d server/solr/collection1/conf -force - -# start apache, in both foreground and background... -apachectl -DFOREGROUND & - -# TODO: Run Payara as non-root. -cd /opt/payara6 -bin/asadmin start-domain --debug -sleep infinity - diff --git a/conf/docker-aio/httpd.conf b/conf/docker-aio/httpd.conf deleted file mode 100644 index 85c851d785f..00000000000 --- a/conf/docker-aio/httpd.conf +++ /dev/null @@ -1,27 +0,0 @@ - -Include conf.d/*.conf -Include conf.modules.d/*.conf -ServerName localhost -Listen 80 443 -PidFile run/httpd.pid -DocumentRoot "/var/www/html" -TypesConfig /etc/mime.types -User apache -Group apache - - - ServerName localhost - LogLevel debug - ErrorLog logs/error_log - LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined - CustomLog logs/access_log combined - - # proxy config (aka - what to send to glassfish or not) - ProxyPassMatch ^/Shibboleth.sso ! - ProxyPassMatch ^/shibboleth-ds ! - # pass everything else to Glassfish - ProxyPass / ajp://localhost:8009/ -# glassfish can be slow sometimes - ProxyTimeout 300 - - diff --git a/conf/docker-aio/install.bash b/conf/docker-aio/install.bash deleted file mode 100755 index 2b3275ad830..00000000000 --- a/conf/docker-aio/install.bash +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash -sudo -u postgres createuser --superuser dvnapp -#./entrypoint.bash & -unzip dvinstall.zip -cd dvinstall/ -echo "beginning installer" -./install -admin_email=dvAdmin@mailinator.com -y -f > install.out 2> install.err - -echo "installer complete" -cat install.err diff --git a/conf/docker-aio/prep_it.bash b/conf/docker-aio/prep_it.bash deleted file mode 100755 index adb257e43b1..00000000000 --- a/conf/docker-aio/prep_it.bash +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env bash - -# run through all the steps to setup docker-aio to run integration tests - -# hard-codes several assumptions: image is named dv0, container is named dv, port is 8084 - -# glassfish healthy/ready retries -n_wait=5 - -cd conf/docker-aio -./0prep_deps.sh -./1prep.sh -docker build -t dv0 -f c8.dockerfile . -# cleanup from previous runs if necessary -docker rm -f dv -# start container -docker run -d -p 8084:80 -p 8083:8080 -p 9010:9009 --name dv dv0 -# wait for glassfish to be healthy -i_wait=0 -d_wait=10 -while [ $i_wait -lt $n_wait ] -do - h=`docker inspect -f "{{.State.Health.Status}}" dv` - if [ "healthy" == "${h}" ]; then - break - else - sleep $d_wait - fi - i_wait=$(( $i_wait + 1 )) - -done -# try setupIT.bash -docker exec dv /opt/dv/setupIT.bash -err=$? -if [ $err -ne 0 ]; then - echo "error - setupIT failure" - exit 1 -fi -# configure DOI provider based on docker build arguments / environmental variables -docker exec dv /opt/dv/configure_doi.bash -err=$? -if [ $err -ne 0 ]; then - echo "error - DOI configuration failure" - exit 1 -fi -# handle config for the private url test (and things like publishing...) -./seturl.bash - - -cd ../.. -#echo "docker-aio ready to run integration tests ($i_retry)" -echo "docker-aio ready to run integration tests" -curl http://localhost:8084/api/info/version -echo $? - diff --git a/conf/docker-aio/readme.md b/conf/docker-aio/readme.md deleted file mode 100644 index f3031a5bb6e..00000000000 --- a/conf/docker-aio/readme.md +++ /dev/null @@ -1,64 +0,0 @@ -# Docker All-In-One - -> :information_source: **NOTE: Sunsetting of this module is imminent.** There is no schedule yet, but expect it to go away. -> Please let the [Dataverse Containerization Working Group](https://ct.gdcc.io) know if you are a user and -> what should be preserved. - -First pass docker all-in-one image, intended for running integration tests against. -Also usable for normal development and system evaluation; not intended for production. - -### Requirements: - - java11 compiler, maven, make, wget, docker - -### Quickstart: - - in the root of the repository, run `./conf/docker-aio/prep_it.bash` - - if using DataCite test credentials, update the build args appropriately. - - if all goes well, you should see the results of the `api/info/version` endpoint, including the deployed build (eg `{"status":"OK","data":{"version":"4.8.6","build":"develop-c3e9f40"}}`). If not, you may need to read the non-quickstart instructions. - - run integration tests: `./conf/docker-aio/run-test-suite.sh` - ----- - -## More in-depth documentation: - - -### Initial setup (aka - do once): -- `cd conf/docker-aio` and run `./0prep_deps.sh` to created Payara and Solr tarballs in `conf/docker-aio/dv/deps`. - -### Per-build: - -> Note: If you encounter any issues, see the Troubleshooting section at the end of this document. - -#### Setup - -- `cd conf/docker-aio`, and run `./1prep.sh` to copy files for integration test data into docker build context; `1prep.sh` will also build the war file and installation zip file -- build the docker image: `docker build -t dv0 -f c8.dockerfile .` - -- Run image: `docker run -d -p 8083:8080 -p 8084:80 --name dv dv0` (aka - forward port 8083 locally to 8080 in the container for payara, and 8084 to 80 for apache); if you'd like to connect a java debugger to payara, use `docker run -d -p 8083:8080 -p 8084:80 -p 9010:9009 --name dv dv0` - -- Installation (integration test): `docker exec dv /opt/dv/setupIT.bash` - (Note that it's possible to customize the installation by editing `conf/docker-aio/default.config` and running `docker exec dv /opt/dv/install.bash` but for the purposes of integration testing, the `setupIT.bash` script above works fine.) - -- update `dataverse.siteUrl` (appears only necessary for `DatasetsIT.testPrivateUrl`): `docker exec dv /usr/local/glassfish4/bin/asadmin create-jvm-options "-Ddataverse.siteUrl=http\://localhost\:8084"` (or use the provided `seturl.bash`) - -#### Run integration tests: - -First, cd back to the root of the repo where the `pom.xml` file is (`cd ../..` assuming you're still in the `conf/docker-aio` directory). Then run the test suite with script below: - -`conf/docker-aio/run-test-suite.sh` - -There isn't any strict requirement on the local port (8083, 8084 in this doc), the name of the image (dv0) or container (dv), these can be changed as desired as long as they are consistent. - -### Troubleshooting Notes: - -* If Dataverse' build fails due to an error about `Module` being ambiguous, you might be using a Java 9 compiler. - -* If you see an error like this: - ``` - docker: Error response from daemon: Conflict. The container name "/dv" is already in use by container "5f72a45b68c86c7b0f4305b83ce7d663020329ea4e30fa2a3ce9ddb05223533d" - You have to remove (or rename) that container to be able to reuse that name. - ``` - run something like `docker ps -a | grep dv` to see the container left over from the last run and something like `docker rm 5f72a45b68c8` to remove it. Then try the `docker run` command above again. - -* `empty reply from server` or `Failed to connect to ::1: Cannot assign requested address` tend to indicate either that you haven't given payara enough time to start, or your docker setup is in an inconsistent state and should probably be restarted. - -* For manually fiddling around with the created dataverse, use user `dataverseAdmin` with password `admin1`. diff --git a/conf/docker-aio/run-test-suite.sh b/conf/docker-aio/run-test-suite.sh deleted file mode 100755 index 39809a7a50e..00000000000 --- a/conf/docker-aio/run-test-suite.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -# This is the canonical list of which "IT" tests are expected to pass. - -dvurl=$1 -if [ -z "$dvurl" ]; then - dvurl="http://localhost:8084" -fi - -integrationtests=$( - ServerName localhost - LogLevel debug - ErrorLog logs/error_log - LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined - CustomLog logs/access_log combined - - # proxy config (aka - what to send to glassfish or not) - ProxyPassMatch ^/Shibboleth.sso ! - ProxyPassMatch ^/shibboleth-ds ! - # pass everything else to Glassfish - ProxyPass / ajp://localhost:8009/ -# glassfish can be slow sometimes - ProxyTimeout 300 - - diff --git a/conf/docker-aio/testscripts/db.sh b/conf/docker-aio/testscripts/db.sh deleted file mode 100755 index f0a9e409fd7..00000000000 --- a/conf/docker-aio/testscripts/db.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -psql -U postgres -c "CREATE ROLE dvnapp PASSWORD 'secret' SUPERUSER CREATEDB CREATEROLE INHERIT LOGIN" template1 -psql -U dvnapp -c 'CREATE DATABASE "dvndb" WITH OWNER = "dvnapp"' template1 diff --git a/conf/docker-aio/testscripts/install b/conf/docker-aio/testscripts/install deleted file mode 100755 index 43dd36da2c9..00000000000 --- a/conf/docker-aio/testscripts/install +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh -export HOST_ADDRESS=localhost -export GLASSFISH_ROOT=/opt/payara6 -export FILES_DIR=/opt/payara6/glassfish/domains/domain1/files -export DB_NAME=dvndb -export DB_PORT=5432 -export DB_HOST=localhost -export DB_USER=dvnapp -export DB_PASS=secret -export RSERVE_HOST=localhost -export RSERVE_PORT=6311 -export RSERVE_USER=rserve -export RSERVE_PASS=rserve -export SMTP_SERVER=localhost -export MEM_HEAP_SIZE=2048 -export GLASSFISH_DOMAIN=domain1 -cd scripts/installer -#cp ../../conf/jhove/jhove.conf $GLASSFISH_ROOT/glassfish/domains/$GLASSFISH_DOMAIN/config/jhove.conf -cp /opt/dv/testdata/jhove.conf $GLASSFISH_ROOT/glassfish/domains/$GLASSFISH_DOMAIN/config/jhove.conf -cp /opt/dv/testdata/jhoveConfig.xsd $GLASSFISH_ROOT/glassfish/domains/$GLASSFISH_DOMAIN/config/jhoveConfig.xsd -./as-setup.sh dvndb diff --git a/conf/docker-aio/testscripts/post b/conf/docker-aio/testscripts/post deleted file mode 100755 index 9d725084f07..00000000000 --- a/conf/docker-aio/testscripts/post +++ /dev/null @@ -1,15 +0,0 @@ -#/bin/sh -cd scripts/api -./setup-all.sh --insecure -p=admin1 | tee /tmp/setup-all.sh.out -cd ../.. -psql -U dvnapp dvndb -f doc/sphinx-guides/source/_static/util/createsequence.sql -scripts/search/tests/publish-dataverse-root -#git checkout scripts/api/data/dv-root.json -scripts/search/tests/grant-authusers-add-on-root -echo "exiting post script early (not creating test users, etc.)" -exit -scripts/search/populate-users -scripts/search/create-users -scripts/search/tests/create-all-and-test -scripts/search/tests/publish-spruce1-and-test -#java -jar downloads/schemaSpy_5.0.0.jar -t pgsql -host localhost -db dvndb -u postgres -p secret -s public -dp scripts/installer/pgdriver/postgresql-9.1-902.jdbc4.jar -o /var/www/html/schemaspy/latest diff --git a/conf/docker-dcm/.gitignore b/conf/docker-dcm/.gitignore deleted file mode 100644 index ac39981ce6a..00000000000 --- a/conf/docker-dcm/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.rpm -upload*.bash diff --git a/conf/docker-dcm/0prep.sh b/conf/docker-dcm/0prep.sh deleted file mode 100755 index 300aa39d567..00000000000 --- a/conf/docker-dcm/0prep.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh -DCM_VERSION=0.5 -RSAL_VERSION=0.1 - -if [ ! -e dcm-${DCM_VERSION}-0.noarch.rpm ]; then - wget https://github.com/sbgrid/data-capture-module/releases/download/${DCM_VERSION}/dcm-${DCM_VERSION}-0.noarch.rpm -fi - -if [ ! -e rsal-${RSAL_VERSION}-0.noarch.rpm ] ;then - wget https://github.com/sbgrid/rsal/releases/download/${RSAL_VERSION}/rsal-${RSAL_VERSION}-0.noarch.rpm -fi diff --git a/conf/docker-dcm/c6client.dockerfile b/conf/docker-dcm/c6client.dockerfile deleted file mode 100644 index e4d1ae7da82..00000000000 --- a/conf/docker-dcm/c6client.dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -# build from repo root -FROM centos:6 -RUN yum install -y epel-release -RUN yum install -y rsync openssh-clients jq curl wget lynx -RUN useradd depositor -USER depositor -WORKDIR /home/depositor diff --git a/conf/docker-dcm/cfg/dcm/bashrc b/conf/docker-dcm/cfg/dcm/bashrc deleted file mode 100644 index 07137ab8471..00000000000 --- a/conf/docker-dcm/cfg/dcm/bashrc +++ /dev/null @@ -1,18 +0,0 @@ -# .bashrc - -# User specific aliases and functions - -alias rm='rm -i' -alias cp='cp -i' -alias mv='mv -i' - -# Source global definitions -if [ -f /etc/bashrc ]; then - . /etc/bashrc -fi - -# these are dummy values, obviously -export UPLOADHOST=dcmsrv -export DVAPIKEY=burrito -export DVHOSTINT=dvsrv -export DVHOST=dvsrv diff --git a/conf/docker-dcm/cfg/dcm/entrypoint-dcm.sh b/conf/docker-dcm/cfg/dcm/entrypoint-dcm.sh deleted file mode 100755 index 0db674bfac4..00000000000 --- a/conf/docker-dcm/cfg/dcm/entrypoint-dcm.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh - -/etc/init.d/sshd start -/etc/init.d/redis start -/etc/init.d/rq start -lighttpd -D -f /etc/lighttpd/lighttpd.conf diff --git a/conf/docker-dcm/cfg/dcm/healthcheck-dcm.sh b/conf/docker-dcm/cfg/dcm/healthcheck-dcm.sh deleted file mode 100755 index 3964a79391e..00000000000 --- a/conf/docker-dcm/cfg/dcm/healthcheck-dcm.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh - -r_rq=`/etc/init.d/rq status` -if [ "rq_worker running" != "$r_rq" ]; then - echo "rq failed" - exit 1 -fi -r_www=`/etc/init.d/lighttpd status` -e_www=$? -if [ 0 -ne $e_www ]; then - echo "lighttpd failed" - exit 2 -fi - diff --git a/conf/docker-dcm/cfg/dcm/rq-init-d b/conf/docker-dcm/cfg/dcm/rq-init-d deleted file mode 100755 index 093cd894376..00000000000 --- a/conf/docker-dcm/cfg/dcm/rq-init-d +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/bash - -# chkconfig: 2345 90 60 -# description: rq worker script (single worker process) - -# example rq configuration file (to be placed in /etc/init.d) - -# works on cent6 - -DAEMON=rq_worker -DAEMON_PATH=/opt/dcm/gen/ -export UPLOADHOST=dcmsrv -VIRTUALENV= -LOGFILE=/var/log/${DAEMON}.log -PIDFILE=/var/run/${DAEMON}.pid - -case "$1" in -start) - printf "%-50s" "starting $DAEMON..." - cd $DAEMON_PATH - if [ ! -z "$VIRTUALENV" ]; then - source $VIRTUALENV/bin/activate - fi - rq worker normal --pid $PIDFILE > ${LOGFILE} 2>&1 & -;; -status) - if [ -f $PIDFILE ]; then - PID=`cat $PIDFILE` - if [ -z "`ps axf | grep ${PID} | grep -v grep`" ]; then - printf "%s\n" "$DAEMON not running, but PID file ($PIDFILE) exists" - else - echo "$DAEMON running" - fi - else - printf "%s\n" "$DAEMON not running" - fi -;; -stop) - printf "%-50s" "stopping $DAEMON" - if [ -f $PIDFILE ]; then - PID=`cat $PIDFILE` - kill -HUP $PID - rm -f $PIDFILE - else - printf "%s\n" "no PID file ($PIDFILE) - maybe not running" - fi -;; -restart) - $0 stop - $0 start -;; - -*) - echo "Usage: $0 {status|start|stop|restart}" - exit 1 -esac - diff --git a/conf/docker-dcm/cfg/dcm/test_install.sh b/conf/docker-dcm/cfg/dcm/test_install.sh deleted file mode 100755 index 3026ceb9fa5..00000000000 --- a/conf/docker-dcm/cfg/dcm/test_install.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh - -cp /etc/dcm/rq-init-d /etc/init.d/rq -cp /etc/dcm/lighttpd-conf-dcm /etc/lighttpd/lighttpd.conf -cp /etc/dcm/lighttpd-modules-dcm /etc/lighttpd/modules.conf -cp /etc/dcm/dcm-rssh.conf /etc/rssh.conf - diff --git a/conf/docker-dcm/cfg/rsal/entrypoint-rsal.sh b/conf/docker-dcm/cfg/rsal/entrypoint-rsal.sh deleted file mode 100755 index 92466c3bd4b..00000000000 --- a/conf/docker-dcm/cfg/rsal/entrypoint-rsal.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh - -#/usr/bin/rsync --no-detach --daemon --config /etc/rsyncd.conf -/usr/bin/rsync --daemon --config /etc/rsyncd.conf -lighttpd -D -f /etc/lighttpd/lighttpd.conf diff --git a/conf/docker-dcm/cfg/rsal/lighttpd-modules.conf b/conf/docker-dcm/cfg/rsal/lighttpd-modules.conf deleted file mode 100644 index cdb1438af82..00000000000 --- a/conf/docker-dcm/cfg/rsal/lighttpd-modules.conf +++ /dev/null @@ -1,174 +0,0 @@ -####################################################################### -## -## ansible managed -# -## Modules to load -## ----------------- -## -## at least mod_access and mod_accesslog should be loaded -## all other module should only be loaded if really neccesary -## -## - saves some time -## - saves memory -## -## the default module set contains: -## -## "mod_indexfile", "mod_dirlisting", "mod_staticfile" -## -## you dont have to include those modules in your list -## -## Modules, which are pulled in via conf.d/*.conf -## -## NOTE: the order of modules is important. -## -## - mod_accesslog -> conf.d/access_log.conf -## - mod_compress -> conf.d/compress.conf -## - mod_status -> conf.d/status.conf -## - mod_webdav -> conf.d/webdav.conf -## - mod_cml -> conf.d/cml.conf -## - mod_evhost -> conf.d/evhost.conf -## - mod_simple_vhost -> conf.d/simple_vhost.conf -## - mod_mysql_vhost -> conf.d/mysql_vhost.conf -## - mod_trigger_b4_dl -> conf.d/trigger_b4_dl.conf -## - mod_userdir -> conf.d/userdir.conf -## - mod_rrdtool -> conf.d/rrdtool.conf -## - mod_ssi -> conf.d/ssi.conf -## - mod_cgi -> conf.d/cgi.conf -## - mod_scgi -> conf.d/scgi.conf -## - mod_fastcgi -> conf.d/fastcgi.conf -## - mod_proxy -> conf.d/proxy.conf -## - mod_secdownload -> conf.d/secdownload.conf -## - mod_expire -> conf.d/expire.conf -## - -server.modules = ( - "mod_access", -# "mod_alias", -# "mod_auth", -# "mod_evasive", -# "mod_redirect", -# "mod_rewrite", -# "mod_setenv", -# "mod_usertrack", -) - -## -####################################################################### - -####################################################################### -## -## Config for various Modules -## - -## -## mod_ssi -## -#include "conf.d/ssi.conf" - -## -## mod_status -## -#include "conf.d/status.conf" - -## -## mod_webdav -## -#include "conf.d/webdav.conf" - -## -## mod_compress -## -#include "conf.d/compress.conf" - -## -## mod_userdir -## -#include "conf.d/userdir.conf" - -## -## mod_magnet -## -#include "conf.d/magnet.conf" - -## -## mod_cml -## -#include "conf.d/cml.conf" - -## -## mod_rrdtool -## -#include "conf.d/rrdtool.conf" - -## -## mod_proxy -## -#include "conf.d/proxy.conf" - -## -## mod_expire -## -#include "conf.d/expire.conf" - -## -## mod_secdownload -## -#include "conf.d/secdownload.conf" - -## -####################################################################### - -####################################################################### -## -## CGI modules -## - -## -## SCGI (mod_scgi) -## -#include "conf.d/scgi.conf" - -## -## FastCGI (mod_fastcgi) -## -#include "conf.d/fastcgi.conf" - -## -## plain old CGI (mod_cgi) -## -include "conf.d/cgi.conf" - -## -####################################################################### - -####################################################################### -## -## VHost Modules -## -## Only load ONE of them! -## ======================== -## - -## -## You can use conditionals for vhosts aswell. -## -## see http://www.lighttpd.net/documentation/configuration.html -## - -## -## mod_evhost -## -#include "conf.d/evhost.conf" - -## -## mod_simple_vhost -## -#include "conf.d/simple_vhost.conf" - -## -## mod_mysql_vhost -## -#include "conf.d/mysql_vhost.conf" - -## -####################################################################### diff --git a/conf/docker-dcm/cfg/rsal/lighttpd.conf b/conf/docker-dcm/cfg/rsal/lighttpd.conf deleted file mode 100644 index 5874d60eb48..00000000000 --- a/conf/docker-dcm/cfg/rsal/lighttpd.conf +++ /dev/null @@ -1,43 +0,0 @@ -## lighttpd configuration customized for RSAL; centos7 - -# refuse connections not from frontend or localhost -# DO NOT HAVE THIS OPEN TO THE WORLD!!! -#$HTTP["remoteip"] !~ "192.168.2.2|127.0.0.1" { -#url.access-deny = ("") -#} -server.breakagelog = "/var/log/lighttpd/breakage.log" - -####################################################################### -## -## Some Variable definition which will make chrooting easier. -## -## if you add a variable here. Add the corresponding variable in the -## chroot example aswell. -## -var.log_root = "/var/log/lighttpd" -var.server_root = "/opt/rsal/api" -var.state_dir = "/var/run" -var.home_dir = "/var/lib/lighttpd" -var.conf_dir = "/etc/lighttpd" - -var.cache_dir = "/var/cache/lighttpd" -var.socket_dir = home_dir + "/sockets" -include "modules.conf" -server.port = 80 -server.use-ipv6 = "disable" -server.username = "lighttpd" -server.groupname = "lighttpd" -server.document-root = server_root -server.pid-file = state_dir + "/lighttpd.pid" -server.errorlog = log_root + "/error.log" -include "conf.d/access_log.conf" -include "conf.d/debug.conf" -server.event-handler = "linux-sysepoll" -server.network-backend = "linux-sendfile" -server.stat-cache-engine = "simple" -server.max-connections = 1024 -static-file.exclude-extensions = ( ".php", ".pl", ".fcgi", ".scgi" ) -include "conf.d/mime.conf" -include "conf.d/dirlisting.conf" -server.follow-symlink = "enable" -server.upload-dirs = ( "/var/tmp" ) diff --git a/conf/docker-dcm/cfg/rsal/rsyncd.conf b/conf/docker-dcm/cfg/rsal/rsyncd.conf deleted file mode 100644 index 5a15ab28a12..00000000000 --- a/conf/docker-dcm/cfg/rsal/rsyncd.conf +++ /dev/null @@ -1,8 +0,0 @@ -lock file=/var/run/rsync.lock -log file=/var/log/rsyncd.log -pid file=/var/log/rsyncd.pid - -[10.5072] - path=/public/ - read only=yes - diff --git a/conf/docker-dcm/configure_dcm.sh b/conf/docker-dcm/configure_dcm.sh deleted file mode 100755 index 5b65b0a0314..00000000000 --- a/conf/docker-dcm/configure_dcm.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh - -echo "dcm configs on dv side to be done" - -# in homage to dataverse traditions, reset to insecure "burrito" admin API key -sudo -u postgres psql -c "update apitoken set tokenstring='burrito' where id=1;" dvndb -sudo -u postgres psql -c "update authenticateduser set superuser='t' where id=1;" dvndb - -# dataverse configs for DCM -curl -X PUT -d "SHA-1" "http://localhost:8080/api/admin/settings/:FileFixityChecksumAlgorithm" -curl -X PUT "http://localhost:8080/api/admin/settings/:UploadMethods" -d "dcm/rsync+ssh" -curl -X PUT "http://localhost:8080/api/admin/settings/:DataCaptureModuleUrl" -d "http://dcmsrv" - -# configure for RSAL downloads; but no workflows or RSAL yet -curl -X PUT "http://localhost:8080/api/admin/settings/:DownloadMethods" -d "rsal/rsync" - -# publish root dataverse -curl -X POST -H "X-Dataverse-key: burrito" "http://localhost:8080/api/dataverses/root/actions/:publish" - -# symlink `hold` volume -mkdir -p /usr/local/glassfish4/glassfish/domains/domain1/files/ -ln -s /hold /usr/local/glassfish4/glassfish/domains/domain1/files/10.5072 - -# need to set siteUrl -cd /usr/local/glassfish4 -bin/asadmin create-jvm-options "\"-Ddataverse.siteUrl=http\://localhost\:8084\"" diff --git a/conf/docker-dcm/configure_rsal.sh b/conf/docker-dcm/configure_rsal.sh deleted file mode 100755 index 5db43a34381..00000000000 --- a/conf/docker-dcm/configure_rsal.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh - -fn=rsal-workflow2.json -# needs an actual IP (vs a hostname) for whitelist -rsalip=`dig +short rsalsrv` - -# create workflow -curl -s -X POST -H "Content-type: application/json" -d @${fn} "http://localhost:8080/api/admin/workflows" - -# put rsal on the whitelist -curl -X PUT -d "127.0.0.1;${rsalip}" "http://localhost:8080/api/admin/workflows/ip-whitelist" - -# set workflow as default -curl -X PUT -d "1" "http://localhost:8080/api/admin/workflows/default/PrePublishDataset" - -# local access path -curl -X PUT -d "/hpc/storage" "http://localhost:8080/api/admin/settings/:LocalDataAccessPath" - -# storage sites -curl -X POST -H "Content-type: application/json" --upload-file site-primary.json "http://localhost:8080/api/admin/storageSites" -curl -X POST -H "Content-type: application/json" --upload-file site-remote.json "http://localhost:8080/api/admin/storageSites" diff --git a/conf/docker-dcm/create.bash b/conf/docker-dcm/create.bash deleted file mode 100755 index 58ae6e61dc7..00000000000 --- a/conf/docker-dcm/create.bash +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env bash - - -# user creates dataset -k_d=burrito -dv_d=root -h=http://dvsrv - -fn=dataset.json -#dset_id=`curl -s -H "X-Dataverse-key: $k_d" -X POST --upload-file $fn $h/api/dataverses/$dv_d/datasets | jq .data.id` -r=`curl -s -H "X-Dataverse-key: $k_d" -X POST --upload-file $fn $h/api/dataverses/$dv_d/datasets` -echo $r -dset_id=`echo $r | jq .data.id` -echo "dataset created with id: $dset_id" - -if [ "null" == "${dset_id}" ]; then - echo "error - no dataset id from create command" - exit 1 -fi -echo "dataset created; internal/db id: ${dset_id}" - - diff --git a/conf/docker-dcm/dataset.json b/conf/docker-dcm/dataset.json deleted file mode 100644 index fb1b734ed40..00000000000 --- a/conf/docker-dcm/dataset.json +++ /dev/null @@ -1,126 +0,0 @@ -{ - "datasetVersion": { - "metadataBlocks": { - "citation": { - "displayName": "Citation Metadata", - "fields": [ - { - "typeName": "title", - "multiple": false, - "typeClass": "primitive", - "value": "DCM test dataset" - }, - { - "typeName": "productionDate", - "multiple": false, - "typeClass": "primitive", - "value": "2017-04-01" - }, - { - "typeName": "dsDescription", - "multiple": true, - "typeClass": "compound", - "value": [ - { - "dsDescriptionValue": { - "typeName": "dsDescriptionValue", - "multiple": false, - "typeClass": "primitive", - "value": "this would normally be a dataset large enough to require a DCM" - } - } - ] - }, - { - "typeName": "depositor", - "multiple": false, - "typeClass": "primitive", - "value": "Doc, Bob" - }, - { - "typeName": "producer", - "multiple": true, - "typeClass": "compound", - "value": [ - { - "producerName": { - "typeName": "producerName", - "multiple": false, - "typeClass": "primitive", - "value": "Prof, Arthor" - }, - "producerAffiliation": { - "typeName": "producerAffiliation", - "multiple": false, - "typeClass": "primitive", - "value": "LibraScholar" - } - } - ] - }, - { - "typeName": "author", - "multiple": true, - "typeClass": "compound", - "value": [ - { - "authorName": { - "typeName": "authorName", - "multiple": false, - "typeClass": "primitive", - "value": "Student, Carol" - } - , - "authorAffiliation": { - "typeName": "authorAffiliation", - "multiple": false, - "typeClass": "primitive", - "value": "LibraScholar" - } - }, - { - "authorName": { - "typeName": "authorName", - "multiple": false, - "typeClass": "primitive", - "value": "Doc, Bob" - } - , - "authorAffiliation": { - "typeName": "authorAffiliation", - "multiple": false, - "typeClass": "primitive", - "value": "LibraScholar" - } - } - - ] - }, - { - "typeName": "datasetContact", - "multiple": true, - "typeClass": "compound", - "value": [ - { - "datasetContactEmail": { - "typeName": "datasetContactEmail", - "multiple": false, - "typeClass": "primitive", - "value": "dsContact@mailinator.com" - } - } - ] - }, - { - "typeName": "subject", - "multiple": true, - "typeClass": "controlledVocabulary", - "value": [ - "Medicine, Health and Life Sciences" - ] - } - ] - } - } - } -} diff --git a/conf/docker-dcm/dcmsrv.dockerfile b/conf/docker-dcm/dcmsrv.dockerfile deleted file mode 100644 index 9989fa3a89d..00000000000 --- a/conf/docker-dcm/dcmsrv.dockerfile +++ /dev/null @@ -1,21 +0,0 @@ -# build from repo root -FROM centos:6 -RUN yum install -y epel-release -ARG RPMFILE=dcm-0.5-0.noarch.rpm -COPY ${RPMFILE} /tmp/ -COPY cfg/dcm/bashrc /root/.bashrc -COPY cfg/dcm/test_install.sh /root/ -RUN yum localinstall -y /tmp/${RPMFILE} -RUN pip install -r /opt/dcm/requirements.txt -RUN pip install awscli==1.15.75 -run export PATH=~/.local/bin:$PATH -RUN /root/test_install.sh -COPY cfg/dcm/rq-init-d /etc/init.d/rq -RUN useradd glassfish -COPY cfg/dcm/entrypoint-dcm.sh / -COPY cfg/dcm/healthcheck-dcm.sh / -EXPOSE 80 -EXPOSE 22 -VOLUME /hold -HEALTHCHECK CMD /healthcheck-dcm.sh -CMD ["/entrypoint-dcm.sh"] diff --git a/conf/docker-dcm/docker-compose.yml b/conf/docker-dcm/docker-compose.yml deleted file mode 100644 index 49d4467d349..00000000000 --- a/conf/docker-dcm/docker-compose.yml +++ /dev/null @@ -1,50 +0,0 @@ -# initial docker-compose file for combined Dataverse and DCM with shared filesystem - -version: '3' - -services: - dcmsrv: - build: - context: . - dockerfile: dcmsrv.dockerfile - container_name: dcmsrv - volumes: - - hold:/hold - rsalsrv: - build: - context: . - dockerfile: rsalsrv.dockerfile - container_name: rsalsrv -# image: rsalrepo_rsal - volumes: - - hold:/hold - - ./:/mnt - environment: - DV_HOST: http://dvsrv:8080 - DV_APIKEY: burrito - ports: - - "8889:80" - - "873:873" - dvsrv: - build: - context: . - dockerfile: dv0dcm.dockerfile - container_name: dvsrv - volumes: - - hold:/hold - - ./:/mnt - ports: - - "8083:8080" - - "8084:80" - client: - build: - context: . - dockerfile: c6client.dockerfile - command: sleep infinity - container_name: dcm_client - volumes: - - ./:/mnt - -volumes: - hold: - diff --git a/conf/docker-dcm/dv0dcm.dockerfile b/conf/docker-dcm/dv0dcm.dockerfile deleted file mode 100644 index 021534c8978..00000000000 --- a/conf/docker-dcm/dv0dcm.dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -# dv0 assumed to be image name for docker-aio -FROM dv0 -RUN yum install -y bind-utils -COPY configure_dcm.sh /opt/dv/ -COPY configure_rsal.sh /opt/dv/ -COPY rsal-workflow2.json site-primary.json site-remote.json /opt/dv/ -VOLUME /hold diff --git a/conf/docker-dcm/get_transfer.bash b/conf/docker-dcm/get_transfer.bash deleted file mode 100755 index 42080f536e1..00000000000 --- a/conf/docker-dcm/get_transfer.bash +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash - -# user gets transfer script - -dset_id=$1 -if [ -z "$dset_id" ]; then - echo "no dataset id specified, bailing out" - exit 1 -fi - -k_d=burrito -dv_d=root - -h=http://dvsrv - -#get upload script from DCM -wget --header "X-Dataverse-key: ${k_d}" ${h}/api/datasets/${dset_id}/dataCaptureModule/rsync -O upload-${dset_id}.bash - - diff --git a/conf/docker-dcm/publish_major.bash b/conf/docker-dcm/publish_major.bash deleted file mode 100755 index 6a3fd1288ca..00000000000 --- a/conf/docker-dcm/publish_major.bash +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash - -# publish dataset based on database id - -dset_id=$1 -if [ -z "$dset_id" ]; then - echo "no dataset id specified, bailing out" - exit 1 -fi - -k_d=burrito - -h=http://dvsrv - -curl -X POST -H "X-Dataverse-key: ${k_d}" "${h}/api/datasets/${dset_id}/actions/:publish?type=major" - - diff --git a/conf/docker-dcm/readme.md b/conf/docker-dcm/readme.md deleted file mode 100644 index 3e6a15e61d6..00000000000 --- a/conf/docker-dcm/readme.md +++ /dev/null @@ -1,26 +0,0 @@ -This docker-compose setup is intended for use in development, small scale evaluation, and potentially serve as an example of a working (although not production security level) configuration. - -Setup: - -- build docker-aio image with name dv0 as described in `../docker-aio` (don't start up the docker image or run setupIT.bash) -- work in the `conf/docker-dcm` directory for below commands -- download/prepare dependencies: `./0prep.sh` -- build dcm/dv0dcm images with docker-compose: `docker-compose -f docker-compose.yml build` -- start containers: `docker-compose -f docker-compose.yml up -d` -- wait for container to show "healthy" (aka - `docker ps`), then run dataverse app installation: `docker exec dvsrv /opt/dv/install.bash` -- for development, you probably want to use the `FAKE` DOI provider: `docker exec -it dvsrv /opt/dv/configure_doi.bash` -- configure dataverse application to use DCM: `docker exec -it dvsrv /opt/dv/configure_dcm.sh` -- configure dataverse application to use RSAL (if desired): `docker exec -it dvsrv /opt/dv/configure_rsal.sh` - -Operation: -The dataverse installation is accessible at `http://localhost:8084`. -The `dcm_client` container is intended to be used for executing transfer scripts, and `conf/docker-dcm` is available at `/mnt` inside the container; this container can be accessed with `docker exec -it dcm_client bash`. -The DCM cron job is NOT configured here; for development purposes the DCM checks can be run manually with `docker exec -it dcmsrv /opt/dcm/scn/post_upload.bash`. -The RSAL cron job is similarly NOT configured; for development purposes `docker exec -it rsalsrv /opt/rsal/scn/pub.py` can be run manually. - - -Cleanup: -- shutdown/cleanup `docker-compose -f docker-compose.yml down -v` - -For reference, this configuration was working with docker 17.09 / docker-compose 1.16. - diff --git a/conf/docker-dcm/rsal-workflow2.json b/conf/docker-dcm/rsal-workflow2.json deleted file mode 100644 index 322d3ecbcf7..00000000000 --- a/conf/docker-dcm/rsal-workflow2.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "RSAL file move for publication", - "steps": [ - { - "provider":":internal", - "stepType":"log", - "parameters": { - "message": "Pre-http request" - } - }, - { - "provider":":internal", - "stepType":"http/sr", - "parameters": { - "url":"http://rsalsrv/rr.py", - "method":"POST", - "contentType":"text/plain", - "body":"${invocationId}\ndataset.id=${dataset.id}\ndataset.identifier=${dataset.identifier}\ndataset.globalId=${dataset.globalId}", - "expectedResponse":"OK.*", - "rollbackMethod":"DELETE" - } - }, - { - "provider":":internal", - "stepType":"log", - "parameters": { - "message": "Post-http request" - } - } - ] -} diff --git a/conf/docker-dcm/rsalsrv.dockerfile b/conf/docker-dcm/rsalsrv.dockerfile deleted file mode 100644 index 844432afe6b..00000000000 --- a/conf/docker-dcm/rsalsrv.dockerfile +++ /dev/null @@ -1,20 +0,0 @@ -FROM centos:7 -ARG RPMFILE=rsal-0.1-0.noarch.rpm -RUN yum update; yum install -y epel-release -COPY ${RPMFILE} /tmp/ -RUN yum localinstall -y /tmp/${RPMFILE} -COPY cfg/rsal/rsyncd.conf /etc/rsyncd.conf -COPY cfg/rsal/entrypoint-rsal.sh /entrypoint.sh -COPY cfg/rsal/lighttpd-modules.conf /etc/lighttpd/modules.conf -COPY cfg/rsal/lighttpd.conf /etc/lighttpd/lighttpd.conf -RUN mkdir -p /public/FK2 -RUN pip2 install -r /opt/rsal/scn/requirements.txt -#COPY doc/testdata/ /hold/ -ARG DV_HOST=http://dv_srv:8080 -ARG DV_API_KEY=burrito -ENV DV_HOST ${DV_HOST} -ENV DV_API_KEY ${DV_API_KEY} -EXPOSE 873 -EXPOSE 80 -HEALTHCHECK CMD curl --fail http://localhost/hw.py || exit 1 -CMD ["/entrypoint.sh"] diff --git a/conf/docker-dcm/site-primary.json b/conf/docker-dcm/site-primary.json deleted file mode 100644 index 35b217edffd..00000000000 --- a/conf/docker-dcm/site-primary.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "hostname": "rsalsrv", - "name": "LibraScholar University", - "primaryStorage": true, - "transferProtocols": "rsync,posix" -} diff --git a/conf/docker-dcm/site-remote.json b/conf/docker-dcm/site-remote.json deleted file mode 100644 index d47c3ef4dda..00000000000 --- a/conf/docker-dcm/site-remote.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "hostname": "remote.libra.research", - "name": "LibraResearch Institute", - "primaryStorage": false, - "transferProtocols": "rsync" -} diff --git a/doc/sphinx-guides/source/admin/metadatacustomization.rst b/doc/sphinx-guides/source/admin/metadatacustomization.rst index cac051ddb59..53bc32eca3d 100644 --- a/doc/sphinx-guides/source/admin/metadatacustomization.rst +++ b/doc/sphinx-guides/source/admin/metadatacustomization.rst @@ -413,8 +413,8 @@ Setting Up a Dev Environment for Testing You have several options for setting up a dev environment for testing metadata block changes: +- Docker: See :doc:`/container/index`. - Vagrant: See the :doc:`/developers/tools` section of the Developer Guide. -- docker-aio: See https://github.com/IQSS/dataverse/tree/develop/conf/docker-aio - AWS deployment: See the :doc:`/developers/deployment` section of the Developer Guide. - Full dev environment: See the :doc:`/developers/dev-environment` section of the Developer Guide. diff --git a/doc/sphinx-guides/source/developers/big-data-support.rst b/doc/sphinx-guides/source/developers/big-data-support.rst index e80fd87c5b2..04885571a01 100644 --- a/doc/sphinx-guides/source/developers/big-data-support.rst +++ b/doc/sphinx-guides/source/developers/big-data-support.rst @@ -173,6 +173,8 @@ See also :ref:`Globus settings <:GlobusBasicToken>`. Data Capture Module (DCM) ------------------------- +Please note: The DCM feature is deprecated. + Data Capture Module (DCM) is an experimental component that allows users to upload large datasets via rsync over ssh. DCM was developed and tested using Glassfish but these docs have been updated with references to Payara. @@ -248,104 +250,11 @@ The following low level command should only be used when troubleshooting the "im ``curl -H "X-Dataverse-key: $API_TOKEN" -X POST "$DV_BASE_URL/api/batch/jobs/import/datasets/files/$DATASET_DB_ID?uploadFolder=$UPLOAD_FOLDER&totalSize=$TOTAL_SIZE"`` -Steps to set up a DCM via Docker for Development -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If you need a fully operating DCM client for development purposes, these steps will guide you to setting one up. This includes steps to set up the DCM on S3 variant. - -Docker Image Set-up -^^^^^^^^^^^^^^^^^^^ - -See https://github.com/IQSS/dataverse/blob/develop/conf/docker-dcm/readme.md - -- Install docker if you do not have it - -Optional steps for setting up the S3 Docker DCM Variant -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -- Before: the default bucket for DCM to hold files in S3 is named test-dcm. It is coded into `post_upload_s3.bash` (line 30). Change to a different bucket if needed. -- Also Note: With the new support for multiple file store in the Dataverse Software, DCM requires a store with id="s3" and DCM will only work with this store. - - - Add AWS bucket info to dcmsrv - - Add AWS credentials to ``~/.aws/credentials`` - - - ``[default]`` - - ``aws_access_key_id =`` - - ``aws_secret_access_key =`` - -- Dataverse installation configuration (on dvsrv): - - - Set S3 as the storage driver - - - ``cd /opt/payara6/bin/`` - - ``./asadmin delete-jvm-options "\-Ddataverse.files.storage-driver-id=file"`` - - ``./asadmin create-jvm-options "\-Ddataverse.files.storage-driver-id=s3"`` - - ``./asadmin create-jvm-options "\-Ddataverse.files.s3.type=s3"`` - - ``./asadmin create-jvm-options "\-Ddataverse.files.s3.label=s3"`` - - - - Add AWS bucket info to your Dataverse installation - - Add AWS credentials to ``~/.aws/credentials`` - - - ``[default]`` - - ``aws_access_key_id =`` - - ``aws_secret_access_key =`` - - - Also: set region in ``~/.aws/config`` to create a region file. Add these contents: - - - ``[default]`` - - ``region = us-east-1`` - - - Add the S3 bucket names to your Dataverse installation - - - S3 bucket for your Dataverse installation - - - ``/usr/local/payara6/glassfish/bin/asadmin create-jvm-options "-Ddataverse.files.s3.bucket-name=iqsstestdcmbucket"`` - - - S3 bucket for DCM (as your Dataverse installation needs to do the copy over) - - - ``/usr/local/payara6/glassfish/bin/asadmin create-jvm-options "-Ddataverse.files.dcm-s3-bucket-name=test-dcm"`` - - - Set download method to be HTTP, as DCM downloads through S3 are over this protocol ``curl -X PUT "http://localhost:8080/api/admin/settings/:DownloadMethods" -d "native/http"`` - -Using the DCM Docker Containers -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -For using these commands, you will need to connect to the shell prompt inside various containers (e.g. ``docker exec -it dvsrv /bin/bash``) - -- Create a dataset and download rsync upload script - - - connect to client container: ``docker exec -it dcm_client bash`` - - create dataset: ``cd /mnt ; ./create.bash`` ; this will echo the database ID to stdout - - download transfer script: ``./get_transfer.bash $database_id_from_create_script`` - - execute the transfer script: ``bash ./upload-${database_id_from-create_script}.bash`` , and follow instructions from script. - -- Run script - - - e.g. ``bash ./upload-3.bash`` (``3`` being the database id from earlier commands in this example). - -- Manually run post upload script on dcmsrv - - - for posix implementation: ``docker exec -it dcmsrv /opt/dcm/scn/post_upload.bash`` - - for S3 implementation: ``docker exec -it dcmsrv /opt/dcm/scn/post_upload_s3.bash`` - -Additional DCM docker development tips -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -- You can completely blow away all the docker images with these commands (including non DCM ones!) - - ``docker-compose -f docmer-compose.yml down -v`` - -- There are a few logs to tail - - - dvsrv : ``tail -n 2000 -f /opt/payara6/glassfish/domains/domain1/logs/server.log`` - - dcmsrv : ``tail -n 2000 -f /var/log/lighttpd/breakage.log`` - - dcmsrv : ``tail -n 2000 -f /var/log/lighttpd/access.log`` - -- You may have to restart the app server domain occasionally to deal with memory filling up. If deployment is getting reallllllly slow, its a good time. - Repository Storage Abstraction Layer (RSAL) ------------------------------------------- +Please note: The RSAL feature is deprecated. + Steps to set up a DCM via Docker for Development ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/doc/sphinx-guides/source/developers/containers.rst b/doc/sphinx-guides/source/developers/containers.rst index b42f7f5a2e2..175b178b455 100755 --- a/doc/sphinx-guides/source/developers/containers.rst +++ b/doc/sphinx-guides/source/developers/containers.rst @@ -25,11 +25,6 @@ The primary community-lead projects (which the core team is drawing inspiration - https://github.com/IQSS/dataverse-docker - https://github.com/IQSS/dataverse-kubernetes (especially the https://github.com/EOSC-synergy/dataverse-kubernetes fork) -Deprecated Projects -------------------- - -The :doc:`testing` section mentions using docker-aio for integration tests. We do not plan to keep this project alive. - Using Containers for Reproducible Research ------------------------------------------ diff --git a/doc/sphinx-guides/source/developers/testing.rst b/doc/sphinx-guides/source/developers/testing.rst index b1d08299e82..19d9f711f38 100755 --- a/doc/sphinx-guides/source/developers/testing.rst +++ b/doc/sphinx-guides/source/developers/testing.rst @@ -173,12 +173,7 @@ Finally, run the script: Running the full API test suite using Docker ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.. note:: - Sunsetting of this module is imminent.** There is no schedule yet, but expect it to go away. - Please let the `Dataverse Containerization Working Group `_ know if you are a user and - what should be preserved. - -To run the full suite of integration tests on your laptop, we recommend using the "all in one" Docker configuration described in ``conf/docker-aio/readme.md`` in the root of the repo. +To run the full suite of integration tests on your laptop, running Dataverse and its dependencies in Docker, as explained in the :doc:`/container/dev-usage` section of the Container Guide. Alternatively, you can run tests against the app server running on your laptop by following the "getting set up" steps below. diff --git a/doc/sphinx-guides/source/developers/tools.rst b/doc/sphinx-guides/source/developers/tools.rst index cbd27d6e8d2..238db7ce7b0 100755 --- a/doc/sphinx-guides/source/developers/tools.rst +++ b/doc/sphinx-guides/source/developers/tools.rst @@ -38,7 +38,7 @@ From the root of the git repo (where the ``Vagrantfile`` is), run ``vagrant up`` Please note that running ``vagrant up`` for the first time should run the ``downloads/download.sh`` script for you to download required software such as an app server, Solr, etc. However, these dependencies change over time so it's a place to look if ``vagrant up`` was working but later fails. -On Windows if you see an error like ``/usr/bin/perl^M: bad interpreter`` you might need to run ``dos2unix`` on the installation scripts. +On Windows if you see an error like ``/usr/bin/python^M: bad interpreter`` you might need to run ``dos2unix`` on the installation scripts. PlantUML ++++++++ diff --git a/scripts/installer/README.txt b/scripts/installer/README.txt index 350a17fc00c..c3ed8211082 100644 --- a/scripts/installer/README.txt +++ b/scripts/installer/README.txt @@ -1,42 +1 @@ -The installer script (install) can be run either by a developer (inside the source tree), or by an end-user installing the Dataverse. The latter will obtain the script as part of the distribution bundle; and they will be running it inside the unzipped bundle directory. - -In the former (developer) case, the installer will be looking for the files it needs in the other directories in the source tree. -For example, the war file (once built) can be found in ../../target/. The name of the war file will be dataverse-{VERSION}.war, where -{VERSION} is the version number of the Dataverse, obtained from the pom file (../../pom.xml). For example, as of writing this README.txt (July 2015) the war file is ../../target/dataverse-4.1.war/ - -When building a distribution archive, the Makefile will pile all the files that the installer needs in one directory (./dvinstall here) and then zip it up. We upload the resulting zip bundle on github as the actual software release. This way the end user only gets the files they actually need to install the Dataverse app. So they can do so without pulling the entire source tree. - - -The installer script itself (the perl script ./install) knows to look for all these files in 2 places (for example, it will look for the war file in ../../target/; if it's not there, it'll assume this is a distribution bundle and look for it as ./dataverse.war) - -Here's the list of the files that the installer needs: - -the war file: -target/dataverse-{VERSION}.war - -and also: - -from scripts/installer (this directory): - -install -glassfish-setup.sh - -from scripts/api: - -setup-all.sh -setup-builtin-roles.sh -setup-datasetfields.sh -setup-dvs.sh -setup-identity-providers.sh -setup-users.sh -data (the entire directory with all its contents) - -from conf/jhove: - -jhove.conf - -SOLR schema and config files, from conf/solr/8.11.1: - -schema.xml -schema_dv_mdb_fields.xml -solrconfig.xml +See README_python.txt diff --git a/scripts/installer/install b/scripts/installer/install deleted file mode 100755 index 46f9917d08c..00000000000 --- a/scripts/installer/install +++ /dev/null @@ -1,1538 +0,0 @@ -#!/usr/bin/perl - -use strict; -use warnings; -use Getopt::Long; -use Socket; -use File::Copy; - -# command line options: - -my $verbose; -my $postgresonly; -my $hostname; -my $gfuser; -my $gfdir; -my $mailserver; -my $noninteractive; -my $skipdatabasesetup; -my $force; -my $nogfpasswd; -my $admin_email; - -my ($rez) = GetOptions( - #"length=i" => \$length, # numeric - #"file=s" => \$data, # string - "verbose" => \$verbose, - "pg_only" => \$postgresonly, - "skip_db_setup" => \$skipdatabasesetup, - "hostname=s" => \$hostname, - "gfuser=s" => \$gfuser, - "gfdir=s" => \$gfdir, - "mailserver=s" => \$mailserver, - "y|yes" => \$noninteractive, - "f|force" => \$force, - "nogfpasswd" => \$nogfpasswd, - "admin_email=s" => \$admin_email, -); - -# openshift/docker-specific - name of the "pod" executing the installer: -my $pod_name = ""; -if (exists($ENV{'MY_POD_NAME'})) -{ - $pod_name = $ENV{'MY_POD_NAME'}; -} - -my $jq_exec_path = ""; -my $psql_exec_path = ""; -my $cwd; -my $WARFILE_LOCATION = "dataverse.war"; - - -my @CONFIG_VARIABLES; - -if ($postgresonly) -{ - @CONFIG_VARIABLES = - ( 'POSTGRES_SERVER', 'POSTGRES_PORT', 'POSTGRES_DATABASE', 'POSTGRES_USER', 'POSTGRES_PASSWORD', 'POSTGRES_ADMIN_PASSWORD' ); - -} -else -{ - - @CONFIG_VARIABLES = ( - 'HOST_DNS_ADDRESS', - 'GLASSFISH_USER', - 'GLASSFISH_DIRECTORY', - 'ADMIN_EMAIL', - 'MAIL_SERVER', - - 'POSTGRES_SERVER', - 'POSTGRES_PORT', - 'POSTGRES_ADMIN_PASSWORD', - 'POSTGRES_DATABASE', - 'POSTGRES_USER', - 'POSTGRES_PASSWORD', - - 'SOLR_LOCATION', - - 'RSERVE_HOST', - 'RSERVE_PORT', - 'RSERVE_USER', - 'RSERVE_PASSWORD', - - 'DOI_USERNAME', - 'DOI_PASSWORD', - 'DOI_BASEURL', - 'DOI_DATACITERESTAPIURL' - - ); -} - -my %CONFIG_DEFAULTS; - -&read_config_defaults("default.config"); - -my %CONFIG_PROMPTS; -my %CONFIG_COMMENTS; - -&read_interactive_config_values("interactive.config"); - -my $API_URL = "http://localhost:8080/api"; - -# jodbc.postgresql.org recommends 4.2 for Java 8. -# updated drivers may be obtained from -# https://jdbc.postgresql.org/download.html -my $postgres_jdbc = "postgresql-42.2.12.jar"; - -# 0. A few preliminary checks: - -# 0a. OS: - -my $uname_out = `uname -a`; - -my @uname_tokens = split( " ", $uname_out ); - -my $WORKING_OS; -if ( $uname_tokens[0] eq "Darwin" ) { - print "\nThis appears to be a MacOS X system; good.\n"; - # TODO: check the OS version - - $WORKING_OS = "MacOSX"; -} -elsif ( $uname_tokens[0] eq "Linux" ) { - if ( -f "/etc/redhat-release" ) { - print "\nThis appears to be a RedHat system; good.\n"; - $WORKING_OS = "RedHat"; - # TODO: check the distro version - } - else { - print "\nThis appears to be a non-RedHat Linux system;\n"; - print "this installation *may* succeed; but we're not making any promises!\n"; - $WORKING_OS = "Linux"; - } -} else { - print "\nWARNING: This appears to be neither a Linux or MacOS X system!\n"; - print "This installer script will most likely fail. Please refer to the\n"; - print "DVN Installers Guide for more information.\n\n"; - - $WORKING_OS = "Unknown"; - - unless ($noninteractive) { - exit 0; - } - - print "(Normally we would stop right there; but since the \"--yes\" option was specified, we'll attempt to continue)\n\n"; - -} - - -# 0b. host name: - -if ($hostname) { - $CONFIG_DEFAULTS{'HOST_DNS_ADDRESS'} = $hostname; -} else { - my $hostname_from_cmdline = `hostname`; - chop $hostname_from_cmdline; - - $CONFIG_DEFAULTS{'HOST_DNS_ADDRESS'} = $hostname_from_cmdline; -} - -# 0c. check if there is the default.config file with the pre-set configuration values: - -# read default configuration values from tab separated file "default.config" if it exists -# moved after the $hostname_from_cmdline section to avoid excessively complicating the logic -# of command line argument, automatic selection, or config file. -# -# NOTE: if the file contain any Postgres configuration (for example: "POSTGRES_USER dvnApp") -# but an environmental variable with the same name exists - THE ENV. VAR WILL WIN! (don't ask) -# (actually this is to accommodate the openshift docker deployment scenario) - -sub trim { my $s = shift; $s =~ s/^\s+|\s+$//g; return $s }; - -#my $config_default_file = "default.config"; -# -#if ( -e $config_default_file ) -#{ -# print("loading default configuration values from $config_default_file\n"); -# open( my $inp_cfg, $config_default_file ); -# while( my $ln = <$inp_cfg> ) -# { -# my @xs = split('\t', $ln ); -# if ( 2 == @xs ) -# { -# my $k = $xs[0]; -# my $v = trim($xs[1]); -## if (defined $ENV{$k} && ($k eq "POSTGRES_USER" || $k eq "POSTGRES_PASSWORD")) { -## $v = $ENV{$k}; -## } -## if (defined $ENV{'POSTGRESQL_ADMIN_PASSWORD'} && $k eq "POSTGRES_ADMIN_PASSWORD") { -## $v = $ENV{'POSTGRESQL_ADMIN_PASSWORD'}; -## } -# $CONFIG_DEFAULTS{$k}=$v; -# } -# } -#} -#else -#{ -# print("using hard-coded default configuration values (no $config_default_file available)\n"); -#} - -# 0d. current OS user. (the first one we find wins) - -my $current_user = $ENV{LOGNAME} || $ENV{USER} || getpwuid($<); - -# if the username was specified on the command-line, it takes precendence: -if ($gfuser) { - print "Using CLI-specified user $gfuser.\n"; - $CONFIG_DEFAULTS{'GLASSFISH_USER'} = $gfuser; -} - - -if (!$CONFIG_DEFAULTS{'GLASSFISH_USER'} || !$noninteractive) { - $CONFIG_DEFAULTS{'GLASSFISH_USER'} = $current_user; - print "using $current_user.\n"; -} - - -# prefer that we not install as root. -unless ( $< != 0 ) { - print "####################################################################\n"; - print " It is recommended that this script not be run as root.\n"; - print " Consider creating the service account \"dataverse\", giving it ownership\n"; - print " on the glassfish/domains/domain1/ and glassfish/lib/ directories,\n"; - print " along with the JVM-specified files.dir location, and designate\n"; - print " that account to launch and run the Application Server (Payara),\n"; - print " AND use that user account to run this installer.\n"; - print "####################################################################\n"; - - unless ($noninteractive) - { - print "\nPress any key to continue, or ctrl-C to exit the installer...\n\n"; - system "stty cbreak /dev/tty 2>&1"; - unless ($noninteractive) { - my $key = getc(STDIN); - } - system "stty -cbreak /dev/tty 2>&1"; - print "\n"; - } -} - -# ensure $gfuser exists or bail -my $gfidcmd="id $CONFIG_DEFAULTS{'GLASSFISH_USER'} > /dev/null"; -my $gfreturncode=system($gfidcmd); -if ($gfreturncode != 0) { - die "Couldn't find user $gfuser. Please ensure the account exists and is readable by the user running this installer.\n"; -} - -# 0e. the following 2 options can also be specified on the command line, and -# also take precedence over the default values that are hard-coded and/or -# provided in the default.config file: - -if ($mailserver) { - $CONFIG_DEFAULTS{'MAIL_SERVER'} = $mailserver; -} - -if ($gfdir) { - $CONFIG_DEFAULTS{'GLASSFISH_DIRECTORY'} = $gfdir; -} - -# 1. CHECK FOR SOME MANDATORY COMPONENTS (WAR FILE, ETC.) -# since we can't do anything without these things in place, better check for -# them before we go into the interactive config mode. -# (skip if this is a database-only setup) - -unless ($postgresonly) -{ -# 1a. war file: - print "\nChecking if the application .war file is available... "; - -# if this installer section is running out of the installer zip bundle directory, -# the war file will be sitting right here, named "dataverse.war": - - $WARFILE_LOCATION = "dataverse.war"; - -# but if it's not here, this is probably a personal development -# setup, so their build should be up in their source tree: - - unless ( -f $WARFILE_LOCATION ) { - my $DATAVERSE_VERSION = ""; - my $DATAVERSE_POM_FILE = "../../modules/dataverse-parent/pom.xml"; - if ( -f $DATAVERSE_POM_FILE ) - { - open DPF, $DATAVERSE_POM_FILE; - my $pom_line; - while ($pom_line=) - { - chop $pom_line; - if ($pom_line =~/^[ \t]*([0-9\.]+)<\/revision>/) - { - $DATAVERSE_VERSION=$1; - last; - } - } - close DPF; - - if ($DATAVERSE_VERSION ne "") { - $WARFILE_LOCATION = "../../target/dataverse-" . $DATAVERSE_VERSION . ".war"; - } - } - } - -# But, if the war file cannot be found in either of the 2 -# places - we'll just have to give up: - - unless ( -f $WARFILE_LOCATION ) { - print "\nWARNING: Can't find the project .war file!\n"; - print "\tAre you running the installer in the right directory?\n"; - print "\tHave you built the war file?\n"; - print "\t(if not, build the project and run the installer again)\n"; - - exit 0; - } - print " Yes, it is!\n"; - - -# 1b. check and remember the working dir: - chomp( $cwd = `pwd` ); - -# 1d. jq executable: - - my $sys_path = $ENV{'PATH'}; - my @sys_path_dirs = split( ":", $sys_path ); - - if ( $pod_name ne "start-glassfish") # Why is that again? - { - for my $sys_path_dir (@sys_path_dirs) { - if ( -x $sys_path_dir . "/jq" ) { - $jq_exec_path = $sys_path_dir; - last; - } - } - if ( $jq_exec_path eq "" ) { - print STDERR "\nERROR: I haven't been able to find the jq command in your PATH! Please install it from http://stedolan.github.io/jq/\n"; - exit 1; - - } - } - -} - - -# 2. INTERACTIVE CONFIG SECTION: - -print "\nWelcome to the Dataverse installer.\n"; -unless ($postgresonly) { - print "You will be guided through the process of setting up a NEW\n"; - print "instance of the dataverse application\n"; -} -else { - print "You will be guided through the process of configuring your\n"; - print "PostgreSQL database for use by the Dataverse application.\n"; -} - -my $yesno; - -unless ($noninteractive) -{ - print "\nATTENTION: As of Dataverse v.4.19, we are offering a new, experimental \n"; - print "version of the installer script, implemented in Python. It will eventually \n"; - print "replace this script (implemented in Perl). Consult the file README_python.txt \n"; - print "for more information on how to run it. \n"; - - print "\nWould you like to exit and use the new installer instead? [y/n] "; - $yesno = <>; - chop $yesno; - - while ( $yesno ne "y" && $yesno ne "n" ) { - print "Please enter 'y' or 'n'!\n"; - print "(or ctrl-C to exit the installer)\n"; - $yesno = <>; - chop $yesno; - } - - exit 0 if $yesno eq "y"; -} - -ENTERCONFIG: - -print "\n"; -print "Please enter the following configuration values:\n"; -print "(hit [RETURN] to accept the default value)\n"; -print "\n"; - -for my $ENTRY (@CONFIG_VARIABLES) -{ - my $config_prompt = $CONFIG_PROMPTS{$ENTRY}; - my $config_comment = $CONFIG_COMMENTS{$ENTRY}; - - if ( $config_comment eq '' ) - { - print $config_prompt . ": "; - print "[" . $CONFIG_DEFAULTS{$ENTRY} . "] "; - } - else - { - print $config_prompt . $config_comment; - print "[" . $CONFIG_DEFAULTS{$ENTRY} . "] "; - } - - my $user_entry = ""; - - # ($noninteractive means the installer is being run in the non-interactive mode; it will use - # the default values specified so far, without prompting the user for alternative values)\ - unless ($noninteractive) - { - $user_entry = <>; - chop $user_entry; - - if ( $user_entry ne "" ) { - $CONFIG_DEFAULTS{$ENTRY} = $user_entry; - } - - # for some values, we'll try to do some validation right here, in real time: - - if ($ENTRY eq 'ADMIN_EMAIL') - { - $user_entry = $CONFIG_DEFAULTS{$ENTRY}; - my $attempts = 0; - while ($user_entry !~/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/) - { - $attempts++; - print "Please enter a valid email address: "; - $user_entry = <>; - chop $user_entry; - } - - if ($attempts) - { - print "OK, looks legit.\n"; - $CONFIG_DEFAULTS{$ENTRY} = $user_entry; - } - } - elsif ($ENTRY eq 'GLASSFISH_DIRECTORY') - { - # CHECK IF GLASSFISH DIR LOOKS OK: - print "\nChecking your Glassfish installation..."; - - my $g_dir = $CONFIG_DEFAULTS{'GLASSFISH_DIRECTORY'}; - - - unless ( -d $g_dir . "/glassfish/domains/domain1" ) - { - while ( !( -d $g_dir . "/glassfish/domains/domain1" ) ) - { - print "\nInvalid Glassfish directory " . $g_dir . "!\n"; - print "Enter the root directory of your Glassfish installation:\n"; - print "(Or ctrl-C to exit the installer): "; - - $g_dir = <>; - chop $g_dir; - } - } - - # verify that we can write in the Glassfish directory - # (now that we are no longer requiring to run the installer as root) - - my @g_testdirs = ( "/glassfish/domains/domain1", - "/glassfish/domains/domain1/config", - "/glassfish/lib"); - - for my $test_dir (@g_testdirs) - { - if (!(-w ($g_dir . $test_dir))) - { - print "\n"; - die("ERROR: " . $g_dir . $test_dir . " not writable to the user running the installer! Check permissions on Payara6 hierarchy.\n"); - } - } - - - - print "$g_dir looks OK!\n"; - $CONFIG_DEFAULTS{'GLASSFISH_DIRECTORY'} = $g_dir; - - } - elsif ($ENTRY eq 'MAIL_SERVER') - { - my $smtp_server = ""; - while (! &validate_smtp_server() ) - { - print "Enter a valid SMTP (mail) server:\n"; - print "(Or ctrl-C to exit the installer): "; - - $smtp_server = <>; - chop $smtp_server; - - $CONFIG_DEFAULTS{'MAIL_SERVER'} = $smtp_server unless $smtp_server eq ''; - } - - print "\nOK, we were able to establish connection to the SMTP server you have specified.\n"; - print "Please note that you *may* need to configure some extra settings before your \n"; - print "Dataverse can send email. Please consult the \"Mail Host Configuration & Authentication\"\n"; - print "section of the installation guide (http://guides.dataverse.org/en/latest/installation/installation-main.html)\n"; - print "for more information.\n"; - } - } - - print "\n"; -} - -# 2b. CONFIRM VALUES ENTERED: - -print "\nOK, please confirm what you've entered:\n\n"; - -for my $ENTRY (@CONFIG_VARIABLES) { - print $CONFIG_PROMPTS{$ENTRY} . ": " . $CONFIG_DEFAULTS{$ENTRY} . "\n"; -} - -if ($noninteractive) { - $yesno = "y"; -} -else { - print "\nIs this correct? [y/n] "; - $yesno = <>; - chop $yesno; -} - -while ( $yesno ne "y" && $yesno ne "n" ) { - print "Please enter 'y' or 'n'!\n"; - print "(or ctrl-C to exit the installer)\n"; - $yesno = <>; - chop $yesno; -} - -if ( $yesno eq "n" ) { - goto ENTERCONFIG; -} - -# 3. SET UP POSTGRES USER AND DATABASE - -unless($pod_name eq "start-glassfish" || $pod_name eq "dataverse-glassfish-0" || $skipdatabasesetup) { - &setup_postgres(); -# (there's no return code - if anything goes wrong, the method will exit the script, with some diagnostic messages for the user) - print "\nOK, done.\n"; - - if ($postgresonly) - { - exit 0; - } -} - -# 5. CONFIGURE PAYARA - -my $glassfish_dir = $CONFIG_DEFAULTS{'GLASSFISH_DIRECTORY'}; - -my $done = &setup_appserver(); - -# Check if the App is running: - -unless (( - my $exit_code = - system( $glassfish_dir . "/bin/asadmin list-applications | grep -q '^dataverse'" ) - ) == 0 ) -{ - # If the "asadmin list-applications" has failed, it may only mean that an earlier - # "asadmin login" had failed, and asadmin is now failing to run without the user - # supplying the username and password. (And the fact that we are trying to pile the - # output to grep prevents it from providing the prompts). - # So before we give up, we'll try an alternative: - - unless (( - my $exit_code_2 = - system( "curl http://localhost:8080/robots.txt | grep -q '^User-agent'" ) - ) == 0 ) - { - print STDERR "It appears that the Dataverse application is not running...\n"; - print STDERR "Even though the \"asadmin deploy\" command had succeeded earlier.\n\n"; - print STDERR "Aborting - sorry...\n\n"; - - exit 1; - } -} - - -print "\nOK, the Dataverse application appears to be running...\n\n"; - -# Run the additional setup scripts, that populate the metadata block field values, create users -# and dataverses, etc. - -unless ( -d "data" && -f "setup-datasetfields.sh" && -f "setup-users.sh" && -f "setup-dvs.sh" && -f "setup-all.sh" ) { - chdir("../api"); -} - -unless ( -d "data" && -f "setup-datasetfields.sh" && -f "setup-users.sh" && -f "setup-dvs.sh" && -f "setup-builtin-roles.sh" && -f "setup-all.sh" ) { - print "\nERROR: Can't find the metadata and user/dataverse setup scripts!\n"; - print "\tAre you running the installer in the right directory?\n"; - exit 1; -} - -# if there's an admin_email set from arguments, replace the value in `dv-root.json` (called by `setup-all.sh`) -if ($admin_email) -{ - print "setting contact email for root dataverse to: $admin_email\n"; - set_root_contact_email( $admin_email ); -} -else -{ - print "using default contact email for root dataverse\n"; -} - -for my $script ( "setup-all.sh" ) { - # (there's only 1 setup script to run now - it runs all the other required scripts) - print "Executing post-deployment setup script " . $script . "... "; - - my $my_hostname = $CONFIG_DEFAULTS{'HOST_DNS_ADDRESS'}; - - # We used to filter the supplied scripts, replacing "localhost" and the port, in - # case they are running Dataverse on a different port... Now we are simply requiring - # that the port 8080 is still configured in domain.xml when they are running the - # installer: - my $run_script; - #if ( $my_hostname ne "localhost" ) { - # system( "sed 's/localhost:8080/$my_hostname/g' < " . $script . " > tmpscript.sh; chmod +x tmpscript.sh" ); - # $run_script = "tmpscript.sh"; - #} - #else { - $run_script = $script; - #} - - unless ( my $exit_code = system( "./" . $run_script . " > $run_script.$$.log 2>&1") == 0 ) - { - print "\nERROR executing script " . $script . "!\n"; - exit 1; - } - print "done!\n"; -} - -# SOME ADDITIONAL SETTINGS THAT ARE NOT TAKEN CARE OF BY THE setup-all SCRIPT -# NEED TO BE CONFIGURED HERE: - -print "Making additional configuration changes...\n\n"; - - -# a. Configure the Admin email in the Dataverse settings: - -print "Executing " . "curl -X PUT -d " . $CONFIG_DEFAULTS{'ADMIN_EMAIL'} . " " . $API_URL . "/admin/settings/:SystemEmail" . "\n"; - -my $exit_code = system("curl -X PUT -d " . $CONFIG_DEFAULTS{'ADMIN_EMAIL'} . " " . $API_URL . "/admin/settings/:SystemEmail"); -if ( $exit_code ) -{ - print "WARNING: failed to configure the admin email in the Dataverse settings!\n\n"; -} -else -{ - print "OK.\n\n"; -} - -# b. If this installation is going to be using a remote SOLR search engine service, configure its location in the settings: - -if ($CONFIG_DEFAULTS{'SOLR_LOCATION'} ne 'LOCAL') -{ - print "Executing " . "curl -X PUT -d " . $CONFIG_DEFAULTS{'SOLR_LOCATION'} . " " . $API_URL . "/admin/settings/:SolrHostColonPort" . "\n"; - my $exit_code = system("curl -X PUT -d " . $CONFIG_DEFAULTS{'SOLR_LOCATION'} . " " . $API_URL . "/admin/settings/:SolrHostColonPort"); - if ( $exit_code ) - { - print "WARNING: failed to configure the location of the remote SOLR service!\n\n"; - } - else - { - print "OK.\n\n"; - } -} - - - -chdir($cwd); - -print "\n\nYou should now have a running Dataverse instance at\n"; -print " http://" . $CONFIG_DEFAULTS{'HOST_DNS_ADDRESS'} . ":8080\n\n\n"; - -if ($WARFILE_LOCATION =~/([0-9]\.[0-9]\.[0-9])\.war$/) -{ - my $version = $1; - print "If this is a personal development installation, we recommend that you undeploy the currently-running copy \n"; - print "of the application, with the following asadmin command:\n\n"; - print "\t" . $CONFIG_DEFAULTS{'GLASSFISH_DIRECTORY'} . '/bin/asadmin undeploy dataverse-' . $version . "\n\n"; - print "before attempting to deploy from your development environment in NetBeans.\n\n"; -} - - -print "\nYour Dataverse has been configured to use DataCite, to register DOI global identifiers in the \n"; -print "test name space \"10.5072\" with the \"shoulder\" \"FK2\"\n"; -print "However, you have to contact DataCite (support\@datacite.org) and request a test account, before you \n"; -print "can publish datasets. Once you receive the account name and password, add them to your domain.xml,\n"; -print "as the following two JVM options:\n"; -print "\t-Ddoi.username=...\n"; -print "\t-Ddoi.password=...\n"; -print "and restart payara6\n"; -print "If this is a production Dataverse and you are planning to register datasets as \n"; -print "\"real\", non-test DOIs or Handles, consult the \"Persistent Identifiers and Publishing Datasets\"\n"; -print "section of the Installataion guide, on how to configure your Dataverse with the proper registration\n"; -print "credentials.\n\n"; - - - -# (going to skip the Rserve check; it's no longer a required, or even a recommended component) - -exit 0; - -# 9. FINALLY, CHECK IF RSERVE IS RUNNING: -print "\n\nFinally, checking if Rserve is running and accessible...\n"; - -unless ( $CONFIG_DEFAULTS{'RSERVE_PORT'} =~ /^[0-9][0-9]*$/ ) { - print $CONFIG_DEFAULTS{'RSERVE_HOST'} . " does not look like a valid port number,\n"; - print "defaulting to 6311.\n\n"; - - $CONFIG_DEFAULTS{'RSERVE_PORT'} = 6311; -} - -my ( $rserve_iaddr, $rserve_paddr, $rserve_proto ); - -unless ( $rserve_iaddr = inet_aton( $CONFIG_DEFAULTS{'RSERVE_HOST'} ) ) { - print STDERR "Could not look up $CONFIG_DEFAULTS{'RSERVE_HOST'},\n"; - print STDERR "the host you specified as your R server.\n"; - print STDERR "\nDVN can function without a working R server, but\n"; - print STDERR "much of the functionality concerning running statistics\n"; - print STDERR "and analysis on quantitative data will not be available.\n"; - print STDERR "Please consult the Installers guide for more info.\n"; - - exit 0; -} - -$rserve_paddr = sockaddr_in( $CONFIG_DEFAULTS{'RSERVE_PORT'}, $rserve_iaddr ); -$rserve_proto = getprotobyname('tcp'); - -unless ( socket( SOCK, PF_INET, SOCK_STREAM, $rserve_proto ) - && connect( SOCK, $rserve_paddr ) ) -{ - print STDERR "Could not establish connection to $CONFIG_DEFAULTS{'RSERVE_HOST'}\n"; - print STDERR "on port $CONFIG_DEFAULTS{'RSERVE_PORT'}, the address you provided\n"; - print STDERR "for your R server.\n"; - print STDERR "DVN can function without a working R server, but\n"; - print STDERR "much of the functionality concerning running statistics\n"; - print STDERR "and analysis on quantitative data will not be available.\n"; - print STDERR "Please consult the \"Installing R\" section in the Installers guide\n"; - print STDERR "for more info.\n"; - - exit 0; - -} - -close(SOCK); -print "\nOK!\n"; - -# 5. CONFIGURE PAYARA -sub setup_appserver { - my $success = 1; - my $failure = 0; - - my $glassfish_dir = $CONFIG_DEFAULTS{'GLASSFISH_DIRECTORY'}; - - print "\nProceeding with the app. server (Payara6) setup.\n"; - -# 5a. DETERMINE HOW MUCH MEMORY TO GIVE TO GLASSFISH AS HEAP: - - my $gf_heap_default = "2048m"; - my $sys_mem_total = 0; - - if ( -e "/proc/meminfo" && open MEMINFO, "/proc/meminfo" ) { - # Linux - - while ( my $mline = ) { - if ( $mline =~ /MemTotal:[ \t]*([0-9]*) kB/ ) { - $sys_mem_total = $1; - } - } - - close MEMINFO; - -# TODO: Figure out how to determine the amount of memory when running in Docker -# because we're wondering if Dataverse can run in the free OpenShift Online -# offering that only gives you 1 GB of memory. Obviously, if this is someone's -# first impression of Dataverse, we want to to run well! What if you try to -# ingest a large file or perform other memory-intensive operations? For more -# context, see https://github.com/IQSS/dataverse/issues/4040#issuecomment-331282286 - if ( -e "/sys/fs/cgroup/memory/memory.limit_in_bytes" && open CGROUPMEM, "/sys/fs/cgroup/memory/memory.limit_in_bytes" ) { - print "INFO: This system has the CGROUP file /sys/fs/cgroup/memory/memory.limit_in_bytes\n"; - while ( my $limitline = ) { - ### TODO: NO, WE ARE NOT NECESSARILY IN DOCKER! - ###print "We must be running in Docker! Fancy!\n"; - # The goal of this cgroup check is for - # "Setting the heap limit for Glassfish/Payara to 750MB" - # to change to some other value, based on memory available. - print "INFO: /sys/fs/cgroup/memory/memory.limit_in_bytes: $limitline\n"; - my $limit_in_kb = $limitline / 1024; - print "INFO: CGROUP limit_in_kb = $limit_in_kb [ignoring]\n"; - # In openshift.json, notice how PostgreSQL and Solr have - # resources.limits.memory set to "256Mi". - # If you try to give the Dataverse/Glassfish container twice - # as much memory (512 MB) and allow $sys_mem_total to - # be set below, you should see the following: - # "Setting the heap limit for Glassfish to 192MB." - # FIXME: dataverse.war will not deploy with only 512 MB of memory. - # Again, the goal is 1 GB total (512MB + 256MB + 256MB) for - # Glassfish, PostgreSQL, and Solr to fit in the free OpenShift tier. - #print "setting sys_mem_total to: $limit_in_kb\n"; - #$sys_mem_total = $limit_in_kb; - } - close CGROUPMEM; - } - } - elsif ( -x "/usr/sbin/sysctl" ) - { - # MacOS X, probably... - - $sys_mem_total = `/usr/sbin/sysctl -n hw.memsize`; - chop $sys_mem_total; - if ( $sys_mem_total > 0 ) { - $sys_mem_total = int( $sys_mem_total / 1024 ); - # size in kb - } - } - - if ( $sys_mem_total > 0 ) { - # setting the default heap size limit to 3/8 of the available - # amount of memory: - $gf_heap_default = ( int( $sys_mem_total / ( 8 / 3 * 1024 ) ) ); - - print "\nSetting the heap limit for Payara6 to " . $gf_heap_default . "MB. \n"; - print "You may need to adjust this setting to better suit \n"; - print "your system.\n\n"; - - #$gf_heap_default .= "m"; - - } - else - { - print "\nCould not determine the amount of memory on your system.\n"; - print "Setting the heap limit for Payara6 to 2GB. You may need \n"; - print "to adjust the value to better suit your system.\n\n"; - } - - push @CONFIG_VARIABLES, "DEF_MEM_SIZE"; - $CONFIG_DEFAULTS{"DEF_MEM_SIZE"} = $gf_heap_default; - -# TODO: -# is the below still the case with Payara6? -# if the system has more than 4GB of memory (I believe), glassfish must -# be run with the 64 bit flag set explicitly (at least that was the case -# with the MacOS glassfish build...). Verify, and if still the case, -# add a check. - - print "\n*********************\n"; - print "PLEASE NOTE, SOME OF THE ASADMIN COMMANDS ARE GOING TO FAIL,\n"; - print "FOR EXAMPLE, IF A CONFIGURATION SETTING THAT WE ARE TRYING\n"; - print "TO CREATE ALREADY EXISTS; OR IF A JVM OPTION THAT WE ARE\n"; - print "DELETING DOESN'T. THESE \"FAILURES\" ARE NORMAL!\n"; - print "*********************\n\n"; - print "When/if asadmin asks you to \"Enter admin user name\",\n"; - print "it should be safe to hit return and accept the default\n"; - print "(which is \"admin\").\n"; - - print "\nPress any key to continue...\n\n"; - - unless ($noninteractive) - { - system "stty cbreak /dev/tty 2>&1"; - unless ($noninteractive) { - my $key = getc(STDIN); - } - system "stty -cbreak /dev/tty 2>&1"; - } - - print "\n"; - -# 5b. start domain, if not running: - - my $javacheck = `java -version`; - my $exitcode = $?; - unless ( $exitcode == 0 ) { - print STDERR "$javacheck\n" if $javacheck; - print STDERR "Do you have java installed?\n"; - exit 1; - } - my $DOMAIN = "domain1"; - my $DOMAIN_DOWN = - `$CONFIG_DEFAULTS{'GLASSFISH_DIRECTORY'}/bin/asadmin list-domains | grep "$DOMAIN " | grep "not running"`; - print STDERR $DOMAIN_DOWN . "\n"; - if ($DOMAIN_DOWN) { - print "Trying to start domain up...\n"; - if ( $current_user eq $CONFIG_DEFAULTS{'GLASSFISH_USER'} ){ - system( $CONFIG_DEFAULTS{'GLASSFISH_DIRECTORY'} . "/bin/asadmin start-domain domain1" ); - } - else - { - system( "sudo -u $CONFIG_DEFAULTS{'GLASSFISH_USER'} " . $CONFIG_DEFAULTS{'GLASSFISH_DIRECTORY'} . "/bin/asadmin start-domain domain1" ); - } - # TODO: (?) - retest that the domain is running now? - } - else - { - print "domain appears to be up...\n"; - } - -# 5c. create asadmin login, so that the user doesn't have to enter -# the username and password for every asadmin command, if -# access to :4848 is password-protected: - - system( $glassfish_dir. "/bin/asadmin login" ); - -# 5d. configure glassfish using ASADMIN commands: - - $success = &run_asadmin_script(); - -# CHECK EXIT STATUS, BARF IF SETUP SCRIPT FAILED: - - unless ($success) { - print "\nERROR! Failed to configure Payara6 domain!\n"; - print "(see the error messages above - if any)\n"; - print "Aborting...\n"; - - exit 1; - } - -# 5e. Additional config files: - - my $JHOVE_CONFIG = "jhove.conf"; - my $JHOVE_CONF_SCHEMA = "jhoveConfig.xsd"; - - - my $JHOVE_CONFIG_DIST = $JHOVE_CONFIG; - my $JHOVE_CONF_SCHEMA_DIST = $JHOVE_CONF_SCHEMA; - -# (if the installer is being run NOT as part of a distribution zipped bundle, but -# from inside the source tree - adjust the locations of the jhove config files: - - unless ( -f $JHOVE_CONFIG ) { - $JHOVE_CONFIG_DIST = "../../conf/jhove/jhove.conf"; - $JHOVE_CONF_SCHEMA_DIST = "../../conf/jhove/jhoveConfig.xsd"; - } - -# but if we can't find the files in either location, it must mean -# that they are not running the script in the correct directory - so -# nothing else left for us to do but give up: - - unless ( -f $JHOVE_CONFIG_DIST && -f $JHOVE_CONF_SCHEMA_DIST ) { - print "\nERROR! JHOVE configuration files not found in the config dir!\n"; - print "(are you running the installer in the right directory?\n"; - print "Aborting...\n"; - exit 1; - } - - print "\nCopying additional configuration files... "; - - #system( "/bin/cp -f " . $JHOVE_CONF_SCHEMA_DIST . " " . $glassfish_dir . "/glassfish/domains/domain1/config" ); - my $jhove_success = copy ($JHOVE_CONF_SCHEMA_DIST, $glassfish_dir . "/glassfish/domains/domain1/config"); - unless ($jhove_success) - { - print "\n*********************\n"; - print "ERROR: failed to copy jhove config file into " . $glassfish_dir . "/glassfish/domains/domain1/config - do you have write permission in that directory?"; - exit 1; - } - -# The JHOVE conf file has an absolute PATH of the JHOVE config schema file (uh, yeah...) -# - so it may need to be readjusted here: - - if ( $glassfish_dir ne "/usr/local/payara6" ) - { - system( "sed 's:/usr/local/payara6:$glassfish_dir:g' < " . $JHOVE_CONFIG_DIST . " > " . $glassfish_dir . "/glassfish/domains/domain1/config/" . $JHOVE_CONFIG); - } - else - { - system( "/bin/cp -f " . $JHOVE_CONFIG_DIST . " " . $glassfish_dir . "/glassfish/domains/domain1/config" ); - } - - print "done!\n"; - -# 5f. check if payara is running: -# TODO. - -# 5g. DEPLOY THE APPLICATION: - - print "\nAttempting to deploy the application.\n"; - print "Command line: " . $glassfish_dir . "/bin/asadmin deploy " . $WARFILE_LOCATION . "\n"; - unless (( - my $exit_code = - system( $glassfish_dir . "/bin/asadmin deploy " . $WARFILE_LOCATION ) - ) == 0 ) - { - print STDERR "Failed to deploy the application! WAR file: " . $WARFILE_LOCATION . ".\n"; - print STDERR "(exit code: " . $exit_code . ")\n"; - print STDERR "Aborting.\n"; - exit 1; - } - - - print "Finished configuring Payara and deploying the dataverse application. \n"; - - - return $success; -} - -sub run_asadmin_script { - my $success = 1; - my $failure = 0; - - # We are going to run a standalone shell script with a bunch of asadmin - # commands to set up all the Payara components for the application. - # All the parameters must be passed to that script as environmental - # variables: - - $ENV{'GLASSFISH_ROOT'} = $CONFIG_DEFAULTS{'GLASSFISH_DIRECTORY'}; - $ENV{'GLASSFISH_DOMAIN'} = "domain1"; - $ENV{'ASADMIN_OPTS'} = ""; - $ENV{'MEM_HEAP_SIZE'} = $CONFIG_DEFAULTS{'DEF_MEM_SIZE'}; - - $ENV{'DB_PORT'} = $CONFIG_DEFAULTS{'POSTGRES_PORT'}; - $ENV{'DB_HOST'} = $CONFIG_DEFAULTS{'POSTGRES_SERVER'}; - $ENV{'DB_NAME'} = $CONFIG_DEFAULTS{'POSTGRES_DATABASE'}; - $ENV{'DB_USER'} = $CONFIG_DEFAULTS{'POSTGRES_USER'}; - $ENV{'DB_PASS'} = $CONFIG_DEFAULTS{'POSTGRES_PASSWORD'}; - - $ENV{'RSERVE_HOST'} = $CONFIG_DEFAULTS{'RSERVE_HOST'}; - $ENV{'RSERVE_PORT'} = $CONFIG_DEFAULTS{'RSERVE_PORT'}; - $ENV{'RSERVE_USER'} = $CONFIG_DEFAULTS{'RSERVE_USER'}; - $ENV{'RSERVE_PASS'} = $CONFIG_DEFAULTS{'RSERVE_PASSWORD'}; - $ENV{'DOI_BASEURL'} = $CONFIG_DEFAULTS{'DOI_BASEURL'}; - $ENV{'DOI_USERNAME'} = $CONFIG_DEFAULTS{'DOI_USERNAME'}; - $ENV{'DOI_PASSWORD'} = $CONFIG_DEFAULTS{'DOI_PASSWORD'}; - $ENV{'DOI_DATACITERESTAPIURL'} = $CONFIG_DEFAULTS{'DOI_DATACITERESTAPIURL'}; - - $ENV{'HOST_ADDRESS'} = $CONFIG_DEFAULTS{'HOST_DNS_ADDRESS'}; - - my ($mail_server_host, $mail_server_port) = split (":", $CONFIG_DEFAULTS{'MAIL_SERVER'}); - - $ENV{'SMTP_SERVER'} = $mail_server_host; - - if ($mail_server_port) - { - $ENV{'SMTP_SERVER_PORT'} = $mail_server_port; - } - - $ENV{'FILES_DIR'} = - $CONFIG_DEFAULTS{'GLASSFISH_DIRECTORY'} . "/glassfish/domains/" . $ENV{'GLASSFISH_DOMAIN'} . "/files"; - - system("./as-setup.sh"); - - if ($?) { - return $failure; - } - return $success; -} - -sub create_pg_hash { - my $pg_username = shift @_; - my $pg_password = shift @_; - - my $encode_line = $pg_password . $pg_username; - - # for Redhat: - - ##print STDERR "executing /bin/echo -n $encode_line | md5sum\n"; - - my $hash; - if ( $WORKING_OS eq "MacOSX" ) { - $hash = `/bin/echo -n $encode_line | md5`; - } - else { - $hash = `/bin/echo -n $encode_line | md5sum`; - } - - chop $hash; - - $hash =~ s/ \-$//; - - if ( ( length($hash) != 32 ) || ( $hash !~ /^[0-9a-f]*$/ ) ) { - print STDERR "Failed to generate a MD5-encrypted password hash for the Postgres database.\n"; - exit 1; - } - - return $hash; -} - -sub validate_smtp_server { - my ( $mail_server_iaddr, $mail_server__paddr, $mail_server_proto, $mail_server_status ); - - $mail_server_status = 1; - - my $userentry = $CONFIG_DEFAULTS{'MAIL_SERVER'}; - my ($testserver, $testport) = split (":", $userentry); - - unless ( $mail_server_iaddr = inet_aton( $testserver ) ) { - print STDERR "Could not look up $testserver,\n"; - print STDERR "the host you specified as your mail server\n"; - $mail_server_status = 0; - } - - if ($mail_server_status) { - $testport = 25 unless $testport; - my $mail_server_paddr = sockaddr_in( $testport, $mail_server_iaddr ); - $mail_server_proto = getprotobyname('tcp'); - - unless ( socket( SOCK, PF_INET, SOCK_STREAM, $mail_server_proto ) - && connect( SOCK, $mail_server_paddr ) ) - { - print STDERR "Could not establish connection to $CONFIG_DEFAULTS{'MAIL_SERVER'},\n"; - print STDERR "the address you provided for your Mail server.\n"; - print STDERR "Please select a valid mail server, and try again.\n\n"; - - $mail_server_status = 0; - } - - close(SOCK); - } - - return $mail_server_status; -} - -# support function for set_root_contact_email -sub search_replace_file -{ - my ($infile, $pattern, $replacement, $outfile) = @_; - open (my $inp, $infile); - local $/ = undef; - my $txt = <$inp>; - close $inp; - $txt =~s/$pattern/$replacement/g; - open (my $opf, '>:encoding(UTF-8)', $outfile); - print $opf $txt; - close $opf; - return; -} -# set the email address for the default `dataverseAdmin` account -sub set_root_contact_email -{ - my ($contact_email) = @_; - my $config_json = "data/user-admin.json"; - search_replace_file($config_json,"\"email\":\"dataverse\@mailinator.com\"","\"email\":\"$contact_email\"",$config_json); - return; -} - - -sub setup_postgres { - my $pg_local_connection = 0; - my $pg_major_version = 0; - my $pg_minor_version = 0; - - -# We'll need to do a few things as the Postgres admin user; -# We'll assume the name of the admin user is "postgres". - my $POSTGRES_ADMIN_USER = "postgres"; - - - -##Handling container env - - if ($pod_name eq "start-glassfish") - { - # When we are in this openshift "start-glassfish" pod, we get all the - # Postgres configuration from the environmental variables. - print "Init container starting \n"; - $CONFIG_DEFAULTS{'POSTGRES_SERVER'} = $ENV{"POSTGRES_SERVER"} . "." . $ENV{"POSTGRES_SERVICE_HOST"}; - $CONFIG_DEFAULTS{'POSTGRES_DATABASE'} = $ENV{"POSTGRES_DATABASE"}; - $CONFIG_DEFAULTS{'POSTGRES_USER'} = $ENV{"POSTGRES_USER"}; - $CONFIG_DEFAULTS{'POSTGRES_ADMIN_PASSWORD'} = $ENV{"POSTGRES_ADMIN_PASSWORD"}; - # there was a weird case of the postgres admin password option spelled differently in openshift.json - # - as "POSTGRESQL_ADMIN_PASSWORD"; I'm going to change it in openshift.json - but I'm leaving this - # next line here, just in case: (L.A. -- Sept. 2018) - $CONFIG_DEFAULTS{'POSTGRES_ADMIN_PASSWORD'} = $ENV{'POSTGRESQL_ADMIN_PASSWORD'}; - $CONFIG_DEFAULTS{'POSTGRES_PASSWORD'} = $ENV{"POSTGRES_PASSWORD"}; - } - - if ( $CONFIG_DEFAULTS{'POSTGRES_SERVER'} eq 'localhost' || $CONFIG_DEFAULTS{'POSTGRES_SERVER'} eq '127.0.0.1' ) - { - $pg_local_connection = 1; - } -# elsif ($postgresonly) -# { -# print "In the --pg_only mode the script can only be run LOCALLY,\n"; -# print "i.e., on the server where PostgresQL is running, with the\n"; -# print "Postgres server address as localhost - \"127.0.0.1\".\n"; -# exit 1; -# } - -#If it is executing in a container, proceed easy with this all-in-one block - - - - -# 3b. LOCATE THE psql EXECUTABLE: - - if ( $pod_name eq "start-glassfish"){ - $psql_exec_path = "/usr/bin" - } - else - { - my $sys_path = $ENV{'PATH'}; - my @sys_path_dirs = split( ":", $sys_path ); - - for my $sys_path_dir (@sys_path_dirs) { - - if ( -x $sys_path_dir . "/psql" ) { - $psql_exec_path = $sys_path_dir; - - last; - } - } - } - - my $psql_major_version = 0; - my $psql_minor_version = 0; - -# 3c. IF PSQL WAS FOUND IN THE PATH, CHECK ITS VERSION: - - unless ( $psql_exec_path eq "" ) { - open( PSQLOUT, $psql_exec_path . "/psql --version|" ); - - my $psql_version_line = ; - chop $psql_version_line; - close PSQLOUT; - - my ( $postgresName, $postgresNameLong, $postgresVersion ) = split( " ", $psql_version_line ); - - unless ( $postgresName eq "psql" && $postgresVersion =~ /^[0-9][0-9\.]*$/ ) { - print STDERR "\nWARNING: Unexpected output from psql command!\n"; - } - else - { - my (@psql_version_tokens) = split( '\.', $postgresVersion ); - - print "\n\nFound Postgres psql command, version $postgresVersion.\n\n"; - - $psql_major_version = $psql_version_tokens[0]; - $psql_minor_version = $psql_version_tokens[1]; - - $pg_major_version = $psql_major_version; - $pg_minor_version = $psql_minor_version; - - } - } - -# a frequent problem with MacOSX is that the copy of psql found in the PATH -# belongs to the older version of PostgresQL supplied with the OS, which happens -# to be incompatible with the newer builds from the Postgres project; which are -# recommended to be used with Dataverse. So if this is a MacOSX box, we'll -# check what other versions of PG are available, and select the highest version -# we can find: - - if ( $WORKING_OS eq "MacOSX" ) { - my $macos_pg_major_version = 0; - my $macos_pg_minor_version = 0; - - for $macos_pg_minor_version ( "9", "8", "7", "6", "5", "4", "3", "2", "1", "0" ) { - if ( -x "/Library/PostgreSQL/9." . $macos_pg_minor_version . "/bin/psql" ) { - $macos_pg_major_version = 9; - if ( ( $macos_pg_major_version > $psql_major_version ) - || ( $macos_pg_minor_version >= $psql_minor_version ) ) - { - $psql_exec_path = "/Library/PostgreSQL/9." . $macos_pg_minor_version . "/bin"; - $pg_major_version = $macos_pg_major_version; - $pg_minor_version = $macos_pg_minor_version; - } - last; - } - } - } - - my $psql_admin_exec = ""; - - if ( $psql_exec_path eq "" ) - { - if ( $pg_local_connection || $noninteractive) - { - print STDERR "\nERROR: I haven't been able to find the psql command in your PATH!\n"; - print STDERR "Please make sure PostgresQL is properly installed; if necessary, add\n"; - print STDERR "the location of psql to the PATH, then try again.\n\n"; - - exit 1; - } - else - { - print "WARNING: I haven't been able to find the psql command in your PATH!\n"; - print "But since we are configuring a Dataverse instance to use a remote Postgres server,\n"; - print "we can still set up the database by running a setup script on that remote server\n"; - print "(see below for instructions).\n"; - - } - } else { - - print "(Using psql version " . $pg_major_version . "." . $pg_minor_version . ": " . $psql_exec_path . "/psql)\n"; - - - $psql_admin_exec = "PGPASSWORD=" . $CONFIG_DEFAULTS{'POSTGRES_ADMIN_PASSWORD'} . "; export PGPASSWORD; " . $psql_exec_path; - $psql_exec_path = "PGPASSWORD=" . $CONFIG_DEFAULTS{'POSTGRES_PASSWORD'} . "; export PGPASSWORD; " . $psql_exec_path; - - print "Checking if we can talk to Postgres as the admin user...\n"; - } - -# 3d. CHECK IF WE CAN TALK TO POSTGRES AS THE ADMIN: - - if ($psql_exec_path eq "" || system( $psql_admin_exec . "/psql -h " . $CONFIG_DEFAULTS{'POSTGRES_SERVER'} . " -p " . $CONFIG_DEFAULTS{'POSTGRES_PORT'} . " -U " . $POSTGRES_ADMIN_USER . " -d postgres -c 'SELECT * FROM pg_roles' > /dev/null 2>&1" ) ) - { - # No, we can't. :( - if ($pg_local_connection || $noninteractive) - { - # If Postgres is running locally, this is a fatal condition. - # We'll give them some (potentially) helpful pointers and exit. - - print "(Tried executing: " . $psql_admin_exec . "/psql -h " . $CONFIG_DEFAULTS{'POSTGRES_SERVER'} . " -p " . $CONFIG_DEFAULTS{'POSTGRES_PORT'} . " -U " . $POSTGRES_ADMIN_USER . " -d postgres -c 'SELECT * FROM pg_roles' > /dev/null 2>&1) \n"; - print "Nope, I haven't been able to connect to the local instance of PostgresQL as the admin user.\n"; - print "\nIs postgresql running? \n"; - print " On a RedHat-like system, you can check the status of the daemon with\n\n"; - print " service postgresql start\n\n"; - print " On MacOSX, use Applications -> PostgresQL -> Start Server.\n"; - print " (or, if there's no \"Start Server\" item in your PostgresQL folder, \n"; - print " simply restart your MacOSX system!)\n"; - print "\nAlso, please make sure that the daemon is listening to network connections!\n"; - print " - at least on the localhost interface. (See \"Installing Postgres\" section\n"; - print " of the installation manual).\n"; - print "\nFinally, did you supply the correct admin password?\n"; - print " Don't know the admin password for your Postgres installation?\n"; - print " - then simply set the access level to \"trust\" temporarily (for localhost only!)\n"; - print " in your pg_hba.conf file. Again, please consult the \n"; - print " installation manual).\n"; - exit 1; - } - else - { - # If we are configuring the Dataverse instance to use a Postgres server - # running on a remote host, it is possible to configure the database - # without opening remote access for the admin user. They will simply - # have to run this script in the "postgres-only" mode on that server, locally, - # then resume the installation here: - print "(Tried executing: " . $psql_admin_exec . "/psql -h " . $CONFIG_DEFAULTS{'POSTGRES_SERVER'} . " -p " . $CONFIG_DEFAULTS{'POSTGRES_PORT'} . " -U " . $POSTGRES_ADMIN_USER . " -d postgres -c 'SELECT * FROM pg_roles' > /dev/null 2>&1)\n\n"; - print "Haven't been able to connect to the remote Postgres server as the admin user.\n"; - print "(Or you simply don't have psql installed on this server)\n"; - print "It IS possible to configure a database for your Dataverse on a remote server,\n"; - print "without having admin access to that remote Postgres installation.\n\n"; - print "In order to do that, please copy the installer (the entire package) to the server\n"; - print "where PostgresQL is running and run the installer with the \"--pg_only\" option:\n\n"; - print " ./install --pg_only\n\n"; - - print "Press any key to continue the installation process once that has been\n"; - print "done. Or press ctrl-C to exit the installer.\n\n"; - - system "stty cbreak /dev/tty 2>&1"; - my $key = getc(STDIN); - system "stty -cbreak /dev/tty 2>&1"; - print "\n"; - } - } - else - { - print "Yes, we can!\n"; - - # ok, we can proceed with configuring things... - - print "\nConfiguring Postgres Database:\n"; - - # 4c. CHECK IF THIS DB ALREADY EXISTS: - - my $psql_command_dbcheck = - $psql_admin_exec . "/psql -h " . $CONFIG_DEFAULTS{'POSTGRES_SERVER'} . " -p " . $CONFIG_DEFAULTS{'POSTGRES_PORT'} . " -U " . $POSTGRES_ADMIN_USER . " -c '' -d " . $CONFIG_DEFAULTS{'POSTGRES_DATABASE'} . ">/dev/null 2>&1"; - - if ( ( my $exitcode = system($psql_command_dbcheck) ) == 0 ) - { - if ($force) - { - print "WARNING! Database " - . $CONFIG_DEFAULTS{'POSTGRES_DATABASE'} - . " already exists but --force given... continuing.\n"; - } - else - { - print "WARNING! Database " . $CONFIG_DEFAULTS{'POSTGRES_DATABASE'} . " already exists!\n"; - - if ($noninteractive) - { - exit 1; - } - else - { - print "\nPress any key to continue, or ctrl-C to exit the installer...\n\n"; - - system "stty cbreak /dev/tty 2>&1"; - my $key = getc(STDIN); - system "stty -cbreak /dev/tty 2>&1"; - print "\n"; - - } - } - } - - # 3e. CHECK IF THIS USER ALREADY EXISTS: - - my $psql_command_rolecheck = - $psql_exec_path . "/psql -h " . $CONFIG_DEFAULTS{'POSTGRES_SERVER'} . " -c '' -d postgres " . $CONFIG_DEFAULTS{'POSTGRES_USER'} . " >/dev/null 2>&1"; - my $exitcode; - - if ( ( $exitcode = system($psql_command_rolecheck) ) == 0 ) - { - print "User (role) " . $CONFIG_DEFAULTS{'POSTGRES_USER'} . " already exists;\n"; - print "Proceeding."; - } - else - { - # 3f. CREATE DVN DB USER: - - print "\nCreating Postgres user (role) for the DVN:\n"; - - open TMPCMD, ">/tmp/pgcmd.$$.tmp"; - - # with md5-encrypted password: - my $pg_password_md5 = - &create_pg_hash( $CONFIG_DEFAULTS{'POSTGRES_USER'}, $CONFIG_DEFAULTS{'POSTGRES_PASSWORD'} ); - my $sql_command = - "CREATE ROLE \"" - . $CONFIG_DEFAULTS{'POSTGRES_USER'} - . "\" PASSWORD 'md5" - . $pg_password_md5 - . "' NOSUPERUSER CREATEDB CREATEROLE INHERIT LOGIN"; - - print TMPCMD $sql_command; - close TMPCMD; - - my $psql_commandline = $psql_admin_exec . "/psql -h " . $CONFIG_DEFAULTS{'POSTGRES_SERVER'} . " -p " . $CONFIG_DEFAULTS{'POSTGRES_PORT'} . " -U " . $POSTGRES_ADMIN_USER . " -d postgres -f /tmp/pgcmd.$$.tmp >/dev/null 2>&1"; - - my $out = qx($psql_commandline 2>&1); - $exitcode = $?; - unless ( $exitcode == 0 ) - { - print STDERR "Could not create the DVN Postgres user role!\n"; - print STDERR "(SQL: " . $sql_command . ")\n"; - print STDERR "(psql exit code: " . $exitcode . ")\n"; - print STDERR "(STDERR and STDOUT was: " . $out . ")\n"; - exit 1; - } - - unlink "/tmp/pgcmd.$$.tmp"; - print "done.\n"; - } - - # 3g. CREATE DVN DB: - - print "\nCreating Postgres database:\n"; - - my $psql_command = - $psql_admin_exec - . "/createdb -h " . $CONFIG_DEFAULTS{'POSTGRES_SERVER'} . " -p " . $CONFIG_DEFAULTS{'POSTGRES_PORT'} . " -U " . $POSTGRES_ADMIN_USER ." " - . $CONFIG_DEFAULTS{'POSTGRES_DATABASE'} . " --owner=" - . $CONFIG_DEFAULTS{'POSTGRES_USER'}; - - my $out = qx($psql_command 2>&1); - $exitcode = $?; - unless ( $exitcode == 0 ) - { - print STDERR "Could not create Postgres database for the Dataverse app!\n"; - print STDERR "(command: " . $psql_command . ")\n"; - print STDERR "(psql exit code: " . $exitcode . ")\n"; - print STDERR "(STDOUT and STDERR: " . $out . ")\n"; - if ($force) - { - print STDERR "\ncalled with --force, continuing\n"; - } - else - { - print STDERR "\naborting the installation (sorry!)\n\n"; - exit 1; - } - } - } - -# Whether the user and the database were created locally or remotely, we'll now -# verify that we can talk to that database, with the credentials of the database -# user that we want the Dataverse application to be using: - - if ( $psql_exec_path ne "" && system( $psql_exec_path . "/psql -h " . $CONFIG_DEFAULTS{'POSTGRES_SERVER'} . " -p " . $CONFIG_DEFAULTS{'POSTGRES_PORT'} . " -U " . $CONFIG_DEFAULTS{'POSTGRES_USER'} . " -d " . $CONFIG_DEFAULTS{'POSTGRES_DATABASE'} . " -c 'SELECT * FROM pg_roles' > /dev/null 2>&1" ) ) - { - print STDERR "Oops, haven't been able to connect to the database " . $CONFIG_DEFAULTS{'POSTGRES_DATABASE'} . ",\n"; - print STDERR "running on " . $CONFIG_DEFAULTS{'POSTGRES_SERVER'} . ", as user " . $CONFIG_DEFAULTS{'POSTGRES_USER'} . ".\n\n"; - print STDERR "Aborting the installation (sorry!)\n"; - exit 1; - } -} - -sub read_config_defaults { - my $config_file = shift @_; - - unless ( -f $config_file ) - { - print STDERR "Can't find the config file " . $config_file . "!\n"; - exit 1; - } - - open CF, $config_file || die "Can't open config file " . $config_file . " for reading.\n"; - - while () - { - chop; - - if ( $_ =~/^[A-Z]/ && $_ =~/ *= */ ) - { - my ($name, $value) = split(/ *= */, $_, 2); - $CONFIG_DEFAULTS{$name} = $value; - } - } - close CF; -} - -sub read_interactive_config_values { - my $config_file = shift @_; - - unless ( -f $config_file ) - { - print STDERR "Can't find the config file " . $config_file . "!\n"; - exit 1; - } - - open CF, $config_file || die "Can't open config file " . $config_file . " for reading.\n"; - - my $mode = ""; - - while () - { - chop; - - if ( $_ eq "[prompts]" || $_ eq "[comments]" ) - { - $mode = $_; - } - - if ( $_ =~/^[A-Z]/ && $_ =~/ *= */ ) - { - my ($name, $value) = split(/ *= */, $_, 2); - - if ( $mode eq "[prompts]" ) - { - $CONFIG_PROMPTS{$name} = $value; - } - elsif ( $mode eq "[comments]" ) - { - $value =~s/\\n/\n/g; - $CONFIG_COMMENTS{$name} = $value; - } - } - } - close CF; -} diff --git a/tests/run_docker_dataverse.sh b/tests/run_docker_dataverse.sh deleted file mode 100644 index 56d55f8b057..00000000000 --- a/tests/run_docker_dataverse.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -cd .. -. ./conf/docker-aio/prep_it.bash From a0e8c8c04dc8870b63d6d45f0e350c43544afbf0 Mon Sep 17 00:00:00 2001 From: GPortas Date: Thu, 3 Aug 2023 12:20:19 +0100 Subject: [PATCH 037/173] Fixed: deploy beta tesing action to enable api-session-auth feature flag --- .github/workflows/deploy_beta_testing.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/deploy_beta_testing.yml b/.github/workflows/deploy_beta_testing.yml index 3e67bfe426e..5050da7aa8a 100644 --- a/.github/workflows/deploy_beta_testing.yml +++ b/.github/workflows/deploy_beta_testing.yml @@ -18,6 +18,10 @@ jobs: distribution: 'zulu' java-version: '11' + - name: Enable API Session Auth feature flag + working-directory: src/main/resources/META-INF + run: echo -e "dataverse.feature.api-session-auth=true" >> microprofile-config.properties + - name: Build application war run: mvn package From aedc4a3e42bed51ca5ccb641cdb0b179d9ec2688 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Thu, 3 Aug 2023 16:14:12 -0400 Subject: [PATCH 038/173] fix link #8305 --- doc/sphinx-guides/source/developers/testing.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/sphinx-guides/source/developers/testing.rst b/doc/sphinx-guides/source/developers/testing.rst index b1d08299e82..ace21dcdd29 100755 --- a/doc/sphinx-guides/source/developers/testing.rst +++ b/doc/sphinx-guides/source/developers/testing.rst @@ -484,7 +484,7 @@ Future Work on Unit Tests - Review pull requests from @bencomp for ideas for approaches to testing: https://github.com/IQSS/dataverse/pulls?q=is%3Apr+author%3Abencomp - Come up with a way to test commands: http://irclog.iq.harvard.edu/dataverse/2015-11-04#i_26750 -- Test EJBs using Arquillian, embedded app servers, or similar. @bmckinney kicked the tires on Arquillian at https://github.com/bmckinney/bio-dataverse/commit/2f243b1db1ca704a42cd0a6de329083763b7c37a +- Test EJBs using Arquillian, embedded app servers, or similar. @bmckinney kicked the tires on Arquillian at https://github.com/bmckinney/bio-dataverse/commit/2f243b1db1ca704a42cd0a5de329083763b7c37a Future Work on Integration Tests ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From c18ab9ba92d760b051de4bb77261b5d637000172 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Thu, 3 Aug 2023 16:15:48 -0400 Subject: [PATCH 039/173] explain need to build base image for new Payara #8305 --- doc/sphinx-guides/source/container/dev-usage.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/sphinx-guides/source/container/dev-usage.rst b/doc/sphinx-guides/source/container/dev-usage.rst index 3fbe55766d5..c20bba04af7 100644 --- a/doc/sphinx-guides/source/container/dev-usage.rst +++ b/doc/sphinx-guides/source/container/dev-usage.rst @@ -6,6 +6,8 @@ Please note! This Docker setup is not for production! .. contents:: |toctitle| :local: +.. _container-dev-quickstart: + Quickstart ---------- @@ -183,3 +185,8 @@ There are a lot of tutorials how to connect your IDE's debugger to a remote endp as the endpoint. Here are links to the most common IDEs docs on remote debugging: `Eclipse `_, `IntelliJ `_ + +Building Your Own Base Image +---------------------------- + +If you find yourself tasked with upgrading Payara, you will need to create your own base image before running the :ref:`container-dev-quickstart`. For instructions, see :doc:`base-image`. From 8dcc88e9f96f9c9384c6a316551dea01e2f2eab3 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Thu, 3 Aug 2023 16:16:22 -0400 Subject: [PATCH 040/173] tiny style change --- doc/sphinx-guides/source/container/dev-usage.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/sphinx-guides/source/container/dev-usage.rst b/doc/sphinx-guides/source/container/dev-usage.rst index c20bba04af7..cbfe3949820 100644 --- a/doc/sphinx-guides/source/container/dev-usage.rst +++ b/doc/sphinx-guides/source/container/dev-usage.rst @@ -174,7 +174,7 @@ restart the application container: Using ``docker container inspect dev_dataverse | grep Image`` you can verify the changed checksums. -Using A Debugger +Using a Debugger ---------------- The :doc:`base-image` enables usage of the `Java Debugging Wire Protocol `_ From 911775bef497409457ce4de3dbea6a24b4d6ac32 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Thu, 3 Aug 2023 16:16:57 -0400 Subject: [PATCH 041/173] cleanup, simplify #8305 --- scripts/installer/as-setup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/installer/as-setup.sh b/scripts/installer/as-setup.sh index a5729eaef65..8d0cbe60cf4 100755 --- a/scripts/installer/as-setup.sh +++ b/scripts/installer/as-setup.sh @@ -61,7 +61,7 @@ function preliminary_setup() #./asadmin $ASADMIN_OPTS delete-jvm-options "-XX\:MaxPermSize=192m" #./asadmin $ASADMIN_OPTS create-jvm-options "-XX\:MaxPermSize=512m" #./asadmin $ASADMIN_OPTS create-jvm-options "-XX\:PermSize=256m" - # payara6 ships with the "-server" option already in domain.xml, so no need: + # Payara ships with the "-server" option already in domain.xml, so no need: #./asadmin $ASADMIN_OPTS delete-jvm-options -client # new Payara options: (thanks to donsizemore@unc.edu) From b689f67b9323996e9d422e9396dda7f52056eeb2 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Thu, 3 Aug 2023 16:18:20 -0400 Subject: [PATCH 042/173] simplify to just class name, not jakarta namespace #8305 --- .../harvard/iq/dataverse/DatasetLinkingServiceBean.java | 3 ++- .../edu/harvard/iq/dataverse/DatasetServiceBean.java | 6 +++--- .../harvard/iq/dataverse/DatasetVersionServiceBean.java | 9 +++++---- .../edu/harvard/iq/dataverse/DvObjectServiceBean.java | 4 ++-- .../java/edu/harvard/iq/dataverse/MailServiceBean.java | 3 ++- .../edu/harvard/iq/dataverse/ManageGuestbooksPage.java | 4 +++- .../edu/harvard/iq/dataverse/ManageTemplatesPage.java | 4 +++- .../edu/harvard/iq/dataverse/RolePermissionFragment.java | 4 +++- .../edu/harvard/iq/dataverse/api/ApiBlockingFilter.java | 3 ++- .../java/edu/harvard/iq/dataverse/api/ApiRouter.java | 3 ++- .../harvard/iq/dataverse/api/DatasetFieldServiceApi.java | 2 +- .../iq/dataverse/api/datadeposit/SwordFilter.java | 3 ++- .../providers/builtin/BuiltinUserServiceBean.java | 2 +- .../harvard/iq/dataverse/metrics/MetricsServiceBean.java | 8 ++++---- 14 files changed, 35 insertions(+), 23 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetLinkingServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DatasetLinkingServiceBean.java index 9faeab4b3bc..39c82bfa3f1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetLinkingServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetLinkingServiceBean.java @@ -11,6 +11,7 @@ import jakarta.ejb.Stateless; import jakarta.inject.Named; import jakarta.persistence.EntityManager; +import jakarta.persistence.NoResultException; import jakarta.persistence.PersistenceContext; import jakarta.persistence.Query; import jakarta.persistence.TypedQuery; @@ -63,7 +64,7 @@ public DatasetLinkingDataverse findDatasetLinkingDataverse(Long datasetId, Long .setParameter("datasetId", datasetId) .setParameter("linkingDataverseId", linkingDataverseId) .getSingleResult(); - } catch (jakarta.persistence.NoResultException e) { + } catch (NoResultException e) { logger.fine("no datasetLinkingDataverse found for datasetId " + datasetId + " and linkingDataverseId " + linkingDataverseId); return null; } diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DatasetServiceBean.java index 1f521865bf9..8001f0d93e6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetServiceBean.java @@ -330,7 +330,7 @@ public Dataset findByGlobalId(String globalId) { * in the dataset components, a ConstraintViolationException will be thrown, * which can be further parsed to detect the specific offending values. * @param id the id of the dataset - * @throws jakarta.validation.ConstraintViolationException + * @throws ConstraintViolationException */ @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) @@ -398,7 +398,7 @@ public DatasetVersionUser getDatasetVersionUser(DatasetVersion version, User use query.setParameter("userId", au.getId()); try { return query.getSingleResult(); - } catch (jakarta.persistence.NoResultException e) { + } catch (NoResultException e) { return null; } } @@ -513,7 +513,7 @@ public List listLocks(DatasetLock.Reason lockType, AuthenticatedUse } try { return query.getResultList(); - } catch (jakarta.persistence.NoResultException e) { + } catch (NoResultException e) { return null; } } diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java index 38bc60b00d6..81dfc679c67 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java @@ -31,6 +31,7 @@ import jakarta.json.Json; import jakarta.json.JsonObjectBuilder; import jakarta.persistence.EntityManager; +import jakarta.persistence.NoResultException; import jakarta.persistence.PersistenceContext; import jakarta.persistence.Query; import jakarta.persistence.TypedQuery; @@ -179,7 +180,7 @@ public DatasetVersion findByFriendlyVersionNumber(Long datasetId, String friendl query.setParameter("majorVersionNumber", majorVersionNumber); query.setParameter("minorVersionNumber", minorVersionNumber); foundDatasetVersion = (DatasetVersion) query.getSingleResult(); - } catch (jakarta.persistence.NoResultException e) { + } catch (NoResultException e) { logger.warning("no ds version found: " + datasetId + " " + friendlyVersionNumber); // DO nothing, just return null. } @@ -207,7 +208,7 @@ public DatasetVersion findByFriendlyVersionNumber(Long datasetId, String friendl } } return retVal; - } catch (jakarta.persistence.NoResultException e) { + } catch (NoResultException e) { logger.warning("no ds version found: " + datasetId + " " + friendlyVersionNumber); // DO nothing, just return null. } @@ -434,7 +435,7 @@ private DatasetVersion getDatasetVersionByQuery(String queryString){ msg("Found: " + ds); return ds; - } catch (jakarta.persistence.NoResultException e) { + } catch (NoResultException e) { msg("DatasetVersion not found: " + queryString); logger.log(Level.FINE, "DatasetVersion not found: {0}", queryString); return null; @@ -1200,7 +1201,7 @@ public List getUnarchivedDatasetVersions(){ try { List dsl = em.createNamedQuery("DatasetVersion.findUnarchivedReleasedVersion", DatasetVersion.class).getResultList(); return dsl; - } catch (jakarta.persistence.NoResultException e) { + } catch (NoResultException e) { logger.log(Level.FINE, "No unarchived DatasetVersions found: {0}"); return null; } catch (EJBException e) { diff --git a/src/main/java/edu/harvard/iq/dataverse/DvObjectServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DvObjectServiceBean.java index 2be21373ae1..d4219c36149 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DvObjectServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DvObjectServiceBean.java @@ -133,7 +133,7 @@ private DvObject runFindByGlobalId(Query query, GlobalId gid, DvObject.DType dty query.setParameter("authority", gid.getAuthority()); query.setParameter("dtype", dtype.getDType()); foundDvObject = (DvObject) query.getSingleResult(); - } catch (jakarta.persistence.NoResultException e) { + } catch (NoResultException e) { // (set to .info, this can fill the log file with thousands of // these messages during a large harvest run) logger.fine("no dvObject found: " + gid.asString()); @@ -154,7 +154,7 @@ private Long runFindIdByGlobalId(Query query, GlobalId gid, DvObject.DType dtype query.setParameter("authority", gid.getAuthority()); query.setParameter("dtype", dtype.getDType()); foundDvObject = (Long) query.getSingleResult(); - } catch (jakarta.persistence.NoResultException e) { + } catch (NoResultException e) { // (set to .info, this can fill the log file with thousands of // these messages during a large harvest run) logger.fine("no dvObject found: " + gid.asString()); diff --git a/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java index d3db8c7e9a2..c30f754504f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java @@ -39,6 +39,7 @@ import jakarta.mail.internet.MimeMessage; import edu.harvard.iq.dataverse.validation.EMailValidator; +import jakarta.json.JsonObject; import org.apache.commons.lang3.StringUtils; /** @@ -612,7 +613,7 @@ public String getMessageTextBasedOnNotification(UserNotification userNotificatio case DATASETMENTIONED: String additionalInfo = userNotification.getAdditionalInfo(); dataset = (Dataset) targetObject; - jakarta.json.JsonObject citingResource = null; + JsonObject citingResource = null; citingResource = JsonUtil.getJsonObject(additionalInfo); diff --git a/src/main/java/edu/harvard/iq/dataverse/ManageGuestbooksPage.java b/src/main/java/edu/harvard/iq/dataverse/ManageGuestbooksPage.java index 6b7737ce313..cc89cfd9d56 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ManageGuestbooksPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/ManageGuestbooksPage.java @@ -14,7 +14,9 @@ import jakarta.ejb.EJB; import jakarta.faces.application.FacesMessage; import jakarta.faces.context.FacesContext; +import jakarta.faces.event.AbortProcessingException; import jakarta.faces.event.ActionEvent; +import jakarta.faces.event.AjaxBehaviorEvent; import jakarta.faces.view.ViewScoped; import jakarta.inject.Inject; import jakarta.inject.Named; @@ -325,7 +327,7 @@ public void setDisplayDownloadAll(boolean displayDownloadAll) { this.displayDownloadAll = displayDownloadAll; } - public String updateGuestbooksRoot(jakarta.faces.event.AjaxBehaviorEvent event) throws jakarta.faces.event.AbortProcessingException { + public String updateGuestbooksRoot(AjaxBehaviorEvent event) throws AbortProcessingException { try { dataverse = engineService.submit( new UpdateDataverseGuestbookRootCommand(!isInheritGuestbooksValue(), diff --git a/src/main/java/edu/harvard/iq/dataverse/ManageTemplatesPage.java b/src/main/java/edu/harvard/iq/dataverse/ManageTemplatesPage.java index b97a2d77c96..98369a2eab3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ManageTemplatesPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/ManageTemplatesPage.java @@ -23,6 +23,8 @@ import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import edu.harvard.iq.dataverse.util.BundleUtil; +import jakarta.faces.event.AbortProcessingException; +import jakarta.faces.event.AjaxBehaviorEvent; /** * * @author skraffmiller @@ -237,7 +239,7 @@ public void viewSelectedTemplate(Template selectedTemplate) { tempPage.setTemplate(selectedTemplate); } - public String updateTemplatesRoot(jakarta.faces.event.AjaxBehaviorEvent event) throws jakarta.faces.event.AbortProcessingException { + public String updateTemplatesRoot(AjaxBehaviorEvent event) throws AbortProcessingException { try { if (dataverse.getOwner() != null) { if (isInheritTemplatesValue() && dataverse.getDefaultTemplate() == null && dataverse.getOwner().getDefaultTemplate() != null) { diff --git a/src/main/java/edu/harvard/iq/dataverse/RolePermissionFragment.java b/src/main/java/edu/harvard/iq/dataverse/RolePermissionFragment.java index 67a9e3ee572..1bd337452c2 100644 --- a/src/main/java/edu/harvard/iq/dataverse/RolePermissionFragment.java +++ b/src/main/java/edu/harvard/iq/dataverse/RolePermissionFragment.java @@ -36,6 +36,8 @@ import jakarta.persistence.PersistenceContext; import edu.harvard.iq.dataverse.util.BundleUtil; +import jakarta.faces.event.AbortProcessingException; +import jakarta.faces.event.AjaxBehaviorEvent; import org.apache.commons.text.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; @@ -92,7 +94,7 @@ public void setInheritAssignments(boolean inheritAssignments) { this.inheritAssignments = inheritAssignments; } - public void updatePermissionRoot(jakarta.faces.event.AjaxBehaviorEvent event) throws jakarta.faces.event.AbortProcessingException { + public void updatePermissionRoot(AjaxBehaviorEvent event) throws AbortProcessingException { try { dvObject = commandEngine.submit( new UpdatePermissionRootCommand(!inheritAssignments, diff --git a/src/main/java/edu/harvard/iq/dataverse/api/ApiBlockingFilter.java b/src/main/java/edu/harvard/iq/dataverse/api/ApiBlockingFilter.java index 19f4732f79a..0e5b8226310 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/ApiBlockingFilter.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/ApiBlockingFilter.java @@ -11,6 +11,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import jakarta.ejb.EJB; +import jakarta.servlet.Filter; import jakarta.servlet.FilterChain; import jakarta.servlet.FilterConfig; import jakarta.servlet.ServletException; @@ -24,7 +25,7 @@ * A web filter to block API administration calls. * @author michael */ -public class ApiBlockingFilter implements jakarta.servlet.Filter { +public class ApiBlockingFilter implements Filter { public static final String UNBLOCK_KEY_QUERYPARAM = "unblock-key"; interface BlockPolicy { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/ApiRouter.java b/src/main/java/edu/harvard/iq/dataverse/api/ApiRouter.java index acc66b2e12a..193e1059415 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/ApiRouter.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/ApiRouter.java @@ -1,5 +1,6 @@ package edu.harvard.iq.dataverse.api; +import jakarta.servlet.Filter; import java.io.IOException; import java.util.logging.Logger; import jakarta.servlet.FilterChain; @@ -15,7 +16,7 @@ * * @author michael */ -public class ApiRouter implements jakarta.servlet.Filter { +public class ApiRouter implements Filter { private static final Logger logger = Logger.getLogger(ApiRouter.class.getName()); @Override diff --git a/src/main/java/edu/harvard/iq/dataverse/api/DatasetFieldServiceApi.java b/src/main/java/edu/harvard/iq/dataverse/api/DatasetFieldServiceApi.java index ef7b3a2f45c..00b7dfa6e36 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/DatasetFieldServiceApi.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/DatasetFieldServiceApi.java @@ -207,7 +207,7 @@ public Response showControlledVocabularyForSubject() { @GET @Path("loadNAControlledVocabularyValue") public Response loadNAControlledVocabularyValue() { - // the find will throw a jakarta.persistence.NoResultException if no values are in db + // the find will throw a NoResultException if no values are in db // datasetFieldService.findNAControlledVocabularyValue(); TypedQuery naValueFinder = em.createQuery("SELECT OBJECT(o) FROM ControlledVocabularyValue AS o WHERE o.datasetFieldType is null AND o.strValue = :strvalue", ControlledVocabularyValue.class); naValueFinder.setParameter("strvalue", DatasetField.NA_VALUE); diff --git a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SwordFilter.java b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SwordFilter.java index 6e5335668f9..aa7e028a4ba 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SwordFilter.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SwordFilter.java @@ -1,5 +1,6 @@ package edu.harvard.iq.dataverse.api.datadeposit; +import jakarta.servlet.Filter; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.ServletRequest; @@ -8,7 +9,7 @@ import jakarta.servlet.http.HttpServletRequestWrapper; import java.io.IOException; -public class SwordFilter implements jakarta.servlet.Filter { +public class SwordFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/BuiltinUserServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/BuiltinUserServiceBean.java index a6cc22f44ca..ffbc5d7a027 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/BuiltinUserServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/BuiltinUserServiceBean.java @@ -88,7 +88,7 @@ public BuiltinUser findByUserName(String userName) { return em.createNamedQuery("BuiltinUser.findByUserName", BuiltinUser.class) .setParameter("userName", userName) .getSingleResult(); - } catch (jakarta.persistence.NoResultException e) { + } catch (NoResultException e) { return null; } catch (NonUniqueResultException ex) { logger.log(Level.WARNING, "multiple accounts found for username {0}", userName); diff --git a/src/main/java/edu/harvard/iq/dataverse/metrics/MetricsServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/metrics/MetricsServiceBean.java index 4ef8d630bf6..065b42e5afe 100644 --- a/src/main/java/edu/harvard/iq/dataverse/metrics/MetricsServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/metrics/MetricsServiceBean.java @@ -382,7 +382,7 @@ public JsonArray filesByType(Dataverse d) { jab.add(stats); } - } catch (jakarta.persistence.NoResultException nr) { + } catch (NoResultException nr) { // do nothing } return jab.build(); @@ -518,7 +518,7 @@ public JsonArray fileDownloads(String yyyymm, Dataverse d, boolean uniqueCounts) job.add(MetricsUtil.COUNT, (long) result[2]); jab.add(job); } - } catch (jakarta.persistence.NoResultException nr) { + } catch (NoResultException nr) { // do nothing } return jab.build(); @@ -557,7 +557,7 @@ public JsonArray uniqueDatasetDownloads(String yyyymm, Dataverse d) { jab.add(job); } - } catch (jakarta.persistence.NoResultException nr) { + } catch (NoResultException nr) { // do nothing } return jab.build(); @@ -717,7 +717,7 @@ public Metric getMetric(String name, String dataLocation, String dayString, Data Metric metric = null; try { metric = (Metric) query.getSingleResult(); - } catch (jakarta.persistence.NoResultException nr) { + } catch (NoResultException nr) { // do nothing logger.fine("No result"); } catch (NonUniqueResultException nur) { From 9e4d837fc59870a690fdce3ac67d5717692754b6 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Thu, 3 Aug 2023 16:23:11 -0400 Subject: [PATCH 043/173] update log message to match (changed) exception #8305 The exception was changed in b51d2fc --- src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java index c30f754504f..f17732df7b6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java @@ -123,7 +123,7 @@ public boolean sendSystemEmail(String to, String subject, String messageText, bo sent = true; } catch (MessagingException ssfe) { logger.warning("Failed to send mail to: " + to); - logger.warning("SMTPSendFailedException Message: " + ssfe); + logger.warning("MessagingException Message: " + ssfe); } } else { logger.fine("Skipping sending mail to " + to + ", because the \"no-reply\" address not set (" + Key.SystemEmail + " setting)."); From d817a944195aa4f6acf6ad29db19a53ef419d3d4 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Thu, 3 Aug 2023 16:34:05 -0400 Subject: [PATCH 044/173] add release note #8305 --- doc/release-notes/8305-payara6-ee10-v3.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 doc/release-notes/8305-payara6-ee10-v3.md diff --git a/doc/release-notes/8305-payara6-ee10-v3.md b/doc/release-notes/8305-payara6-ee10-v3.md new file mode 100644 index 00000000000..94369e0211f --- /dev/null +++ b/doc/release-notes/8305-payara6-ee10-v3.md @@ -0,0 +1,5 @@ +Payara has been updated from version 5 to 6. + +Developers, you are encouraged to upgrade to Payara 6 immediately. + +Sysadmins, instructions on how to upgrade production installations will be written as part of https://github.com/IQSS/dataverse/issues/9340 From e48e10a49f25d8884028524d9da65c146d192f5a Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 4 Aug 2023 16:10:25 -0400 Subject: [PATCH 045/173] fix method name --- src/main/webapp/editFilesFragment.xhtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/webapp/editFilesFragment.xhtml b/src/main/webapp/editFilesFragment.xhtml index 1a049331ae4..5fac8241f13 100644 --- a/src/main/webapp/editFilesFragment.xhtml +++ b/src/main/webapp/editFilesFragment.xhtml @@ -903,7 +903,7 @@ filter="false"> - + From a1357401b9b3d8f242cb3e787603158dd4409003 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Mon, 7 Aug 2023 10:48:10 -0400 Subject: [PATCH 046/173] switch dev-env to Docker #9616 --- .../source/container/dev-usage.rst | 14 +- .../source/developers/classic-dev-env.rst | 266 ++++++++++++++++++ .../source/developers/dev-environment.rst | 258 +++-------------- doc/sphinx-guides/source/developers/index.rst | 1 + 4 files changed, 305 insertions(+), 234 deletions(-) create mode 100755 doc/sphinx-guides/source/developers/classic-dev-env.rst diff --git a/doc/sphinx-guides/source/container/dev-usage.rst b/doc/sphinx-guides/source/container/dev-usage.rst index cbfe3949820..04c7eba7913 100644 --- a/doc/sphinx-guides/source/container/dev-usage.rst +++ b/doc/sphinx-guides/source/container/dev-usage.rst @@ -6,22 +6,10 @@ Please note! This Docker setup is not for production! .. contents:: |toctitle| :local: -.. _container-dev-quickstart: - Quickstart ---------- -First, install Java 11 and Maven. - -After cloning the repo, try this: - -``mvn -Pct clean package docker:run`` - -After some time you should be able to log in: - -- url: http://localhost:8080 -- username: dataverseAdmin -- password: admin1 +See :ref:`container-dev-quickstart`. Intro ----- diff --git a/doc/sphinx-guides/source/developers/classic-dev-env.rst b/doc/sphinx-guides/source/developers/classic-dev-env.rst new file mode 100755 index 00000000000..423f609dd2f --- /dev/null +++ b/doc/sphinx-guides/source/developers/classic-dev-env.rst @@ -0,0 +1,266 @@ +======================= +Classic Dev Environment +======================= + +These are the old instructions we used for Dataverse 4 and 5. They should still work but these days we favor running Dataverse in Docker as described in :doc:`dev-environment`. + +These instructions are purposefully opinionated and terse to help you get your development environment up and running as quickly as possible! Please note that familiarity with running commands from the terminal is assumed. + +.. contents:: |toctitle| + :local: + +Quick Start (Docker) +-------------------- + +The quickest way to get Dataverse running is in Docker as explained in :doc:`../container/dev-usage` section of the Container Guide. + + +Classic Dev Environment +----------------------- + +Since before Docker existed, we have encouraged installing Dataverse and all its dependencies directly on your development machine, as described below. This can be thought of as the "classic" development environment for Dataverse. + +However, in 2023 we decided that we'd like to encourage all developers to start using Docker instead and opened https://github.com/IQSS/dataverse/issues/9616 to indicate that we plan to rewrite this page to recommend the use of Docker. + +There's nothing wrong with the classic instructions below and we don't plan to simply delete them. They are a valid alternative to running Dataverse in Docker. We will likely move them to another page. + +Set Up Dependencies +------------------- + +Supported Operating Systems +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Mac OS X or Linux is required because the setup scripts assume the presence of standard Unix utilities. + +Windows is gaining support through Docker as described in the :doc:`windows` section. + +Install Java +~~~~~~~~~~~~ + +The Dataverse Software requires Java 11. + +We suggest downloading OpenJDK from https://adoptopenjdk.net + +On Linux, you are welcome to use the OpenJDK available from package managers. + +Install Netbeans or Maven +~~~~~~~~~~~~~~~~~~~~~~~~~ + +NetBeans IDE is recommended, and can be downloaded from http://netbeans.org . Developers may use any editor or IDE. We recommend NetBeans because it is free, works cross platform, has good support for Jakarta EE projects, and includes a required build tool, Maven. + +Below we describe how to build the Dataverse Software war file with Netbeans but if you prefer to use only Maven, you can find installation instructions in the :doc:`tools` section. + +Install Homebrew (Mac Only) +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +On Mac, install Homebrew to simplify the steps below: https://brew.sh + +Clone the Dataverse Software Git Repo +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Fork https://github.com/IQSS/dataverse and then clone your fork like this: + +``git clone git@github.com:[YOUR GITHUB USERNAME]/dataverse.git`` + +Build the Dataverse Software War File +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If you installed Netbeans, follow these steps: + +- Launch Netbeans and click "File" and then "Open Project". Navigate to where you put the Dataverse Software code and double-click "Dataverse" to open the project. +- If you see "resolve project problems," go ahead and let Netbeans try to resolve them. This will probably including downloading dependencies, which can take a while. +- Allow Netbeans to install nb-javac (required for Java 8 and below). +- Select "Dataverse" under Projects and click "Run" in the menu and then "Build Project (Dataverse)". Check back for "BUILD SUCCESS" at the end. + +If you installed Maven instead of Netbeans, run ``mvn package``. Check for "BUILD SUCCESS" at the end. + +NOTE: Do you use a locale different than ``en_US.UTF-8`` on your development machine? Are you in a different timezone +than Harvard (Eastern Time)? You might experience issues while running tests that were written with these settings +in mind. The Maven ``pom.xml`` tries to handle this for you by setting the locale to ``en_US.UTF-8`` and timezone +``UTC``, but more, not yet discovered building or testing problems might lurk in the shadows. + +Install jq +~~~~~~~~~~ + +On Mac, run this command: + +``brew install jq`` + +On Linux, install ``jq`` from your package manager or download a binary from http://stedolan.github.io/jq/ + +Install Payara +~~~~~~~~~~~~~~ + +Payara 6.2023.7 or higher is required. + +To install Payara, run the following commands: + +``cd /usr/local`` + +``sudo curl -O -L https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/6.2023.7/payara-6.2023.7.zip`` + +``sudo unzip payara-6.2023.7.zip`` + +``sudo chown -R $USER /usr/local/payara6`` + +If nexus.payara.fish is ever down for maintenance, Payara distributions are also available from https://repo1.maven.org/maven2/fish/payara/distributions/payara/ + +Install Service Dependencies Directly on localhost +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Install PostgreSQL +^^^^^^^^^^^^^^^^^^ + +The Dataverse Software has been tested with PostgreSQL versions up to 13. PostgreSQL version 10+ is required. + +On Mac, go to https://www.postgresql.org/download/macosx/ and choose "Interactive installer by EDB" option. Note that version 13.5 is used in the command line examples below, but the process should be similar for other versions. When prompted to set a password for the "database superuser (postgres)" just enter "password". + +After installation is complete, make a backup of the ``pg_hba.conf`` file like this: + +``sudo cp /Library/PostgreSQL/13/data/pg_hba.conf /Library/PostgreSQL/13/data/pg_hba.conf.orig`` + +Then edit ``pg_hba.conf`` with an editor such as vi: + +``sudo vi /Library/PostgreSQL/13/data/pg_hba.conf`` + +In the "METHOD" column, change all instances of "scram-sha-256" (or whatever is in that column) to "trust". This will make it so PostgreSQL doesn't require a password. + +In the Finder, click "Applications" then "PostgreSQL 13" and launch the "Reload Configuration" app. Click "OK" after you see "server signaled". + +Next, to confirm the edit worked, launch the "pgAdmin" application from the same folder. Under "Browser", expand "Servers" and double click "PostgreSQL 13". When you are prompted for a password, leave it blank and click "OK". If you have successfully edited "pg_hba.conf", you can get in without a password. + +On Linux, you should just install PostgreSQL using your favorite package manager, such as ``yum``. (Consult the PostgreSQL section of :doc:`/installation/prerequisites` in the main Installation guide for more info and command line examples). Find ``pg_hba.conf`` and set the authentication method to "trust" and restart PostgreSQL. + +Install Solr +^^^^^^^^^^^^ + +`Solr `_ 8.11.1 is required. + +To install Solr, execute the following commands: + +``sudo mkdir /usr/local/solr`` + +``sudo chown $USER /usr/local/solr`` + +``cd /usr/local/solr`` + +``curl -O http://archive.apache.org/dist/lucene/solr/8.11.1/solr-8.11.1.tgz`` + +``tar xvfz solr-8.11.1.tgz`` + +``cd solr-8.11.1/server/solr`` + +``cp -r configsets/_default collection1`` + +``curl -O https://raw.githubusercontent.com/IQSS/dataverse/develop/conf/solr/8.11.1/schema.xml`` + +``curl -O https://raw.githubusercontent.com/IQSS/dataverse/develop/conf/solr/8.11.1/schema_dv_mdb_fields.xml`` + +``mv schema*.xml collection1/conf`` + +``curl -O https://raw.githubusercontent.com/IQSS/dataverse/develop/conf/solr/8.11.1/solrconfig.xml`` + +``mv solrconfig.xml collection1/conf/solrconfig.xml`` + +``cd /usr/local/solr/solr-8.11.1`` + +(Please note that the extra jetty argument below is a security measure to limit connections to Solr to only your computer. For extra security, run a firewall.) + +``bin/solr start -j "-Djetty.host=127.0.0.1"`` + +``bin/solr create_core -c collection1 -d server/solr/collection1/conf`` + +Install Service Dependencies Using Docker Compose +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +To avoid having to install service dependencies like PostgreSQL or Solr directly on your localhost, there is the alternative of using the ``docker-compose-dev.yml`` file available in the repository root. For this option you need to have Docker and Docker Compose installed on your machine. + +The ``docker-compose-dev.yml`` can be configured to only run the service dependencies necessary to support a Dataverse installation running directly on localhost. In addition to PostgreSQL and Solr, it also runs a SMTP server. + +Before running the Docker Compose file, you need to update the value of the ``DATAVERSE_DB_USER`` environment variable to ``postgres``. The variable can be found inside the ``.env`` file in the repository root. This step is required as the Dataverse installation script expects that database user. + +To run the Docker Compose file, go to the Dataverse repository root, then run: + +``docker-compose -f docker-compose-dev.yml up -d --scale dev_dataverse=0`` + +Note that this command omits the Dataverse container defined in the Docker Compose file, since Dataverse is going to be installed directly on localhost in the next section. + +The command runs the containers in detached mode, but if you want to run them attached and thus view container logs in real time, remove the ``-d`` option from the command. + +Data volumes of each dependency will be persisted inside the ``docker-dev-volumes`` folder, inside the repository root. + +If you want to stop the containers, then run (for detached mode only, otherwise use ``Ctrl + C``): + +``docker-compose -f docker-compose-dev.yml stop`` + +If you want to remove the containers, then run: + +``docker-compose -f docker-compose-dev.yml down`` + +If you want to run a single container (the mail server, for example) then run: + +``docker-compose -f docker-compose-dev.yml up dev_smtp`` + +For a fresh installation, and before running the Software Installer Script, it is recommended to delete the docker-dev-env folder to avoid installation problems due to existing data in the containers. + +Run the Dataverse Software Installer Script +------------------------------------------- + +Navigate to the directory where you cloned the Dataverse Software git repo change directories to the ``scripts/installer`` directory like this: + +``cd scripts/installer`` + +Create a Python virtual environment, activate it, then install dependencies: + +``python3 -m venv venv`` + +``source venv/bin/activate`` + +``pip install psycopg2-binary`` + +The installer will try to connect to the SMTP server you tell it to use. If you haven't used the Docker Compose option for setting up the dependencies, or you don't have a mail server handy, you can run ``nc -l 25`` in another terminal and choose "localhost" (the default) to get past this check. + +Finally, run the installer (see also :download:`README_python.txt <../../../../scripts/installer/README_python.txt>` if necessary): + +``python3 install.py`` + +Verify the Dataverse Software is Running +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +After the script has finished, you should be able to log into your Dataverse installation with the following credentials: + +- http://localhost:8080 +- username: dataverseAdmin +- password: admin + +Configure Your Development Environment for Publishing +----------------------------------------------------- + +Run the following command: + +``curl http://localhost:8080/api/admin/settings/:DoiProvider -X PUT -d FAKE`` + +This will disable DOI registration by using a fake (in-code) DOI provider. Please note that this feature is only available in Dataverse Software 4.10+ and that at present, the UI will give no indication that the DOIs thus minted are fake. + +Developers may also wish to consider using :ref:`PermaLinks ` + +Configure Your Development Environment for GUI Edits +---------------------------------------------------- + +Out of the box, a JSF setting is configured for production use and prevents edits to the GUI (xhtml files) from being visible unless you do a full deployment. + +It is recommended that you run the following command so that simply saving the xhtml file in Netbeans is enough for the change to show up. + +``asadmin create-system-properties "dataverse.jsf.refresh-period=1"`` + +For more on JSF settings like this, see :ref:`jsf-config`. + +Next Steps +---------- + +If you can log in to the Dataverse installation, great! If not, please see the :doc:`troubleshooting` section. For further assistance, please see "Getting Help" in the :doc:`intro` section. + +You're almost ready to start hacking on code. Now that the installer script has you up and running, you need to continue on to the :doc:`tips` section to get set up to deploy code from your IDE or the command line. + +---- + +Previous: :doc:`intro` | Next: :doc:`tips` diff --git a/doc/sphinx-guides/source/developers/dev-environment.rst b/doc/sphinx-guides/source/developers/dev-environment.rst index 4b2163cfefa..dd65a3abc14 100755 --- a/doc/sphinx-guides/source/developers/dev-environment.rst +++ b/doc/sphinx-guides/source/developers/dev-environment.rst @@ -2,263 +2,79 @@ Development Environment ======================= -These instructions are purposefully opinionated and terse to help you get your development environment up and running as quickly as possible! Please note that familiarity with running commands from the terminal is assumed. +These instructions are oriented around Docker but the "classic" instructions we used for Dataverse 4 and 5 are still available at :doc:`classic-dev-env`. .. contents:: |toctitle| :local: -Quick Start (Docker) --------------------- +.. _container-dev-quickstart: -The quickest way to get Dataverse running is in Docker as explained in :doc:`../container/dev-usage` section of the Container Guide. - - -Classic Dev Environment ------------------------ - -Since before Docker existed, we have encouraged installing Dataverse and all its dependencies directly on your development machine, as described below. This can be thought of as the "classic" development environment for Dataverse. +Quickstart +---------- -However, in 2023 we decided that we'd like to encourage all developers to start using Docker instead and opened https://github.com/IQSS/dataverse/issues/9616 to indicate that we plan to rewrite this page to recommend the use of Docker. +First, install Java 11, Maven, and Docker. -There's nothing wrong with the classic instructions below and we don't plan to simply delete them. They are a valid alternative to running Dataverse in Docker. We will likely move them to another page. +After cloning the `dataverse repo `_, run this: -Set Up Dependencies -------------------- +``mvn -Pct clean package docker:run`` -Supported Operating Systems -~~~~~~~~~~~~~~~~~~~~~~~~~~~ +After some time you should be able to log in: -Mac OS X or Linux is required because the setup scripts assume the presence of standard Unix utilities. +- url: http://localhost:8080 +- username: dataverseAdmin +- password: admin1 -Windows is gaining support through Docker as described in the :doc:`windows` section. +Detailed Steps +-------------- Install Java ~~~~~~~~~~~~ The Dataverse Software requires Java 11. -We suggest downloading OpenJDK from https://adoptopenjdk.net +On Mac and Windows, we suggest downloading OpenJDK from https://adoptium.net (formerly `AdoptOpenJDK `_) or `SDKMAN `_. On Linux, you are welcome to use the OpenJDK available from package managers. -Install Netbeans or Maven -~~~~~~~~~~~~~~~~~~~~~~~~~ - -NetBeans IDE is recommended, and can be downloaded from http://netbeans.org . Developers may use any editor or IDE. We recommend NetBeans because it is free, works cross platform, has good support for Jakarta EE projects, and includes a required build tool, Maven. +Install Maven +~~~~~~~~~~~~~ -Below we describe how to build the Dataverse Software war file with Netbeans but if you prefer to use only Maven, you can find installation instructions in the :doc:`tools` section. +Follow instructions at https://maven.apache.org -Install Homebrew (Mac Only) -~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Install Docker +~~~~~~~~~~~~~~ -On Mac, install Homebrew to simplify the steps below: https://brew.sh +Follow instructions at https://www.docker.com -Clone the Dataverse Software Git Repo -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Git Clone Repo +~~~~~~~~~~~~~~ Fork https://github.com/IQSS/dataverse and then clone your fork like this: ``git clone git@github.com:[YOUR GITHUB USERNAME]/dataverse.git`` -Build the Dataverse Software War File -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If you installed Netbeans, follow these steps: - -- Launch Netbeans and click "File" and then "Open Project". Navigate to where you put the Dataverse Software code and double-click "Dataverse" to open the project. -- If you see "resolve project problems," go ahead and let Netbeans try to resolve them. This will probably including downloading dependencies, which can take a while. -- Allow Netbeans to install nb-javac (required for Java 8 and below). -- Select "Dataverse" under Projects and click "Run" in the menu and then "Build Project (Dataverse)". Check back for "BUILD SUCCESS" at the end. - -If you installed Maven instead of Netbeans, run ``mvn package``. Check for "BUILD SUCCESS" at the end. - -NOTE: Do you use a locale different than ``en_US.UTF-8`` on your development machine? Are you in a different timezone -than Harvard (Eastern Time)? You might experience issues while running tests that were written with these settings -in mind. The Maven ``pom.xml`` tries to handle this for you by setting the locale to ``en_US.UTF-8`` and timezone -``UTC``, but more, not yet discovered building or testing problems might lurk in the shadows. - -Install jq -~~~~~~~~~~ - -On Mac, run this command: - -``brew install jq`` - -On Linux, install ``jq`` from your package manager or download a binary from http://stedolan.github.io/jq/ - -Install Payara -~~~~~~~~~~~~~~ - -Payara 6.2023.7 or higher is required. - -To install Payara, run the following commands: - -``cd /usr/local`` - -``sudo curl -O -L https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/6.2023.7/payara-6.2023.7.zip`` - -``sudo unzip payara-6.2023.7.zip`` - -``sudo chown -R $USER /usr/local/payara6`` - -If nexus.payara.fish is ever down for maintenance, Payara distributions are also available from https://repo1.maven.org/maven2/fish/payara/distributions/payara/ - -Install Service Dependencies Directly on localhost -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Install PostgreSQL -^^^^^^^^^^^^^^^^^^ - -The Dataverse Software has been tested with PostgreSQL versions up to 13. PostgreSQL version 10+ is required. - -On Mac, go to https://www.postgresql.org/download/macosx/ and choose "Interactive installer by EDB" option. Note that version 13.5 is used in the command line examples below, but the process should be similar for other versions. When prompted to set a password for the "database superuser (postgres)" just enter "password". - -After installation is complete, make a backup of the ``pg_hba.conf`` file like this: - -``sudo cp /Library/PostgreSQL/13/data/pg_hba.conf /Library/PostgreSQL/13/data/pg_hba.conf.orig`` - -Then edit ``pg_hba.conf`` with an editor such as vi: - -``sudo vi /Library/PostgreSQL/13/data/pg_hba.conf`` - -In the "METHOD" column, change all instances of "scram-sha-256" (or whatever is in that column) to "trust". This will make it so PostgreSQL doesn't require a password. - -In the Finder, click "Applications" then "PostgreSQL 13" and launch the "Reload Configuration" app. Click "OK" after you see "server signaled". - -Next, to confirm the edit worked, launch the "pgAdmin" application from the same folder. Under "Browser", expand "Servers" and double click "PostgreSQL 13". When you are prompted for a password, leave it blank and click "OK". If you have successfully edited "pg_hba.conf", you can get in without a password. - -On Linux, you should just install PostgreSQL using your favorite package manager, such as ``yum``. (Consult the PostgreSQL section of :doc:`/installation/prerequisites` in the main Installation guide for more info and command line examples). Find ``pg_hba.conf`` and set the authentication method to "trust" and restart PostgreSQL. - -Install Solr -^^^^^^^^^^^^ - -`Solr `_ 8.11.1 is required. - -To install Solr, execute the following commands: - -``sudo mkdir /usr/local/solr`` - -``sudo chown $USER /usr/local/solr`` - -``cd /usr/local/solr`` - -``curl -O http://archive.apache.org/dist/lucene/solr/8.11.1/solr-8.11.1.tgz`` - -``tar xvfz solr-8.11.1.tgz`` - -``cd solr-8.11.1/server/solr`` +Build and Run +~~~~~~~~~~~~~ -``cp -r configsets/_default collection1`` +Change into the ``dataverse`` directory you just cloned and run the following command: -``curl -O https://raw.githubusercontent.com/IQSS/dataverse/develop/conf/solr/8.11.1/schema.xml`` +``mvn -Pct clean package docker:run`` -``curl -O https://raw.githubusercontent.com/IQSS/dataverse/develop/conf/solr/8.11.1/schema_dv_mdb_fields.xml`` +Verify +~~~~~~ -``mv schema*.xml collection1/conf`` +After some time you should be able to log in: -``curl -O https://raw.githubusercontent.com/IQSS/dataverse/develop/conf/solr/8.11.1/solrconfig.xml`` - -``mv solrconfig.xml collection1/conf/solrconfig.xml`` - -``cd /usr/local/solr/solr-8.11.1`` - -(Please note that the extra jetty argument below is a security measure to limit connections to Solr to only your computer. For extra security, run a firewall.) - -``bin/solr start -j "-Djetty.host=127.0.0.1"`` - -``bin/solr create_core -c collection1 -d server/solr/collection1/conf`` - -Install Service Dependencies Using Docker Compose -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -To avoid having to install service dependencies like PostgreSQL or Solr directly on your localhost, there is the alternative of using the ``docker-compose-dev.yml`` file available in the repository root. For this option you need to have Docker and Docker Compose installed on your machine. - -The ``docker-compose-dev.yml`` can be configured to only run the service dependencies necessary to support a Dataverse installation running directly on localhost. In addition to PostgreSQL and Solr, it also runs a SMTP server. - -Before running the Docker Compose file, you need to update the value of the ``DATAVERSE_DB_USER`` environment variable to ``postgres``. The variable can be found inside the ``.env`` file in the repository root. This step is required as the Dataverse installation script expects that database user. - -To run the Docker Compose file, go to the Dataverse repository root, then run: - -``docker-compose -f docker-compose-dev.yml up -d --scale dev_dataverse=0`` - -Note that this command omits the Dataverse container defined in the Docker Compose file, since Dataverse is going to be installed directly on localhost in the next section. - -The command runs the containers in detached mode, but if you want to run them attached and thus view container logs in real time, remove the ``-d`` option from the command. - -Data volumes of each dependency will be persisted inside the ``docker-dev-volumes`` folder, inside the repository root. - -If you want to stop the containers, then run (for detached mode only, otherwise use ``Ctrl + C``): - -``docker-compose -f docker-compose-dev.yml stop`` - -If you want to remove the containers, then run: - -``docker-compose -f docker-compose-dev.yml down`` - -If you want to run a single container (the mail server, for example) then run: - -``docker-compose -f docker-compose-dev.yml up dev_smtp`` - -For a fresh installation, and before running the Software Installer Script, it is recommended to delete the docker-dev-env folder to avoid installation problems due to existing data in the containers. - -Run the Dataverse Software Installer Script -------------------------------------------- - -Navigate to the directory where you cloned the Dataverse Software git repo change directories to the ``scripts/installer`` directory like this: - -``cd scripts/installer`` - -Create a Python virtual environment, activate it, then install dependencies: - -``python3 -m venv venv`` - -``source venv/bin/activate`` - -``pip install psycopg2-binary`` - -The installer will try to connect to the SMTP server you tell it to use. If you haven't used the Docker Compose option for setting up the dependencies, or you don't have a mail server handy, you can run ``nc -l 25`` in another terminal and choose "localhost" (the default) to get past this check. - -Finally, run the installer (see also :download:`README_python.txt <../../../../scripts/installer/README_python.txt>` if necessary): - -``python3 install.py`` - -Verify the Dataverse Software is Running -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -After the script has finished, you should be able to log into your Dataverse installation with the following credentials: - -- http://localhost:8080 +- url: http://localhost:8080 - username: dataverseAdmin -- password: admin - -Configure Your Development Environment for Publishing ------------------------------------------------------ - -Run the following command: - -``curl http://localhost:8080/api/admin/settings/:DoiProvider -X PUT -d FAKE`` - -This will disable DOI registration by using a fake (in-code) DOI provider. Please note that this feature is only available in Dataverse Software 4.10+ and that at present, the UI will give no indication that the DOIs thus minted are fake. - -Developers may also wish to consider using :ref:`PermaLinks ` - -Configure Your Development Environment for GUI Edits ----------------------------------------------------- - -Out of the box, a JSF setting is configured for production use and prevents edits to the GUI (xhtml files) from being visible unless you do a full deployment. - -It is recommended that you run the following command so that simply saving the xhtml file in Netbeans is enough for the change to show up. - -``asadmin create-system-properties "dataverse.jsf.refresh-period=1"`` - -For more on JSF settings like this, see :ref:`jsf-config`. - -Next Steps ----------- +- password: admin1 -If you can log in to the Dataverse installation, great! If not, please see the :doc:`troubleshooting` section. For further assistance, please see "Getting Help" in the :doc:`intro` section. +More Information +---------------- -You're almost ready to start hacking on code. Now that the installer script has you up and running, you need to continue on to the :doc:`tips` section to get set up to deploy code from your IDE or the command line. +See also the :doc:`/container/dev-usage` section of the Container Guide. ----- +Getting Help +------------ -Previous: :doc:`intro` | Next: :doc:`tips` +Please feel free to reach out at https://chat.dataverse.org or https://groups.google.com/g/dataverse-dev if you have any difficulty setting up a dev environment! diff --git a/doc/sphinx-guides/source/developers/index.rst b/doc/sphinx-guides/source/developers/index.rst index d70b682fcda..c77ddc13519 100755 --- a/doc/sphinx-guides/source/developers/index.rst +++ b/doc/sphinx-guides/source/developers/index.rst @@ -41,4 +41,5 @@ Developer Guide dataset-migration-api workflows fontcustom + classic-dev-env From 7e74891fa3dfc90da027235ef1eeec7f9af09ac1 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Mon, 7 Aug 2023 14:00:31 -0400 Subject: [PATCH 047/173] upgrade REST Assured to be Java 17 compatible #8094 --- pom.xml | 4 ++-- .../edu/harvard/iq/dataverse/api/AccessIT.java | 8 ++++---- .../edu/harvard/iq/dataverse/api/AdminIT.java | 6 +++--- .../iq/dataverse/api/AuxiliaryFilesIT.java | 6 +++--- .../java/edu/harvard/iq/dataverse/api/BagIT.java | 4 ++-- .../harvard/iq/dataverse/api/BatchImportIT.java | 6 +++--- .../harvard/iq/dataverse/api/BuiltinUsersIT.java | 10 +++++----- .../harvard/iq/dataverse/api/ConfirmEmailIT.java | 8 ++++---- .../edu/harvard/iq/dataverse/api/DataCiteIT.java | 4 ++-- .../iq/dataverse/api/DataRetrieverApiIT.java | 4 ++-- .../edu/harvard/iq/dataverse/api/DatasetsIT.java | 16 ++++++++-------- .../harvard/iq/dataverse/api/DataversesIT.java | 10 +++++----- .../iq/dataverse/api/DeactivateUsersIT.java | 6 +++--- .../harvard/iq/dataverse/api/DeleteUsersIT.java | 6 +++--- .../iq/dataverse/api/DownloadFilesIT.java | 8 ++++---- .../iq/dataverse/api/DuplicateFilesIT.java | 8 ++++---- .../edu/harvard/iq/dataverse/api/EditDDIIT.java | 6 +++--- .../iq/dataverse/api/ExternalToolsIT.java | 6 +++--- .../harvard/iq/dataverse/api/FeedbackApiIT.java | 6 +++--- .../harvard/iq/dataverse/api/FileMetadataIT.java | 8 ++++---- .../iq/dataverse/api/FileTypeDetectionIT.java | 6 +++--- .../edu/harvard/iq/dataverse/api/FilesIT.java | 10 +++++----- .../edu/harvard/iq/dataverse/api/FitsIT.java | 6 +++--- .../iq/dataverse/api/HarvestingClientsIT.java | 8 ++++---- .../iq/dataverse/api/HarvestingServerIT.java | 10 +++++----- .../iq/dataverse/api/InReviewWorkflowIT.java | 8 ++++---- .../edu/harvard/iq/dataverse/api/IndexIT.java | 8 ++++---- .../edu/harvard/iq/dataverse/api/InfoIT.java | 4 ++-- .../iq/dataverse/api/InvalidCharactersIT.java | 4 ++-- .../edu/harvard/iq/dataverse/api/IpGroupsIT.java | 6 +++--- .../edu/harvard/iq/dataverse/api/LicensesIT.java | 6 +++--- .../edu/harvard/iq/dataverse/api/LinkIT.java | 6 +++--- .../edu/harvard/iq/dataverse/api/LogoutIT.java | 4 ++-- .../iq/dataverse/api/MakeDataCountApiIT.java | 4 ++-- .../iq/dataverse/api/MetadataBlocksIT.java | 4 ++-- .../edu/harvard/iq/dataverse/api/MetricsIT.java | 4 ++-- .../edu/harvard/iq/dataverse/api/MoveIT.java | 8 ++++---- .../edu/harvard/iq/dataverse/api/NetcdfIT.java | 6 +++--- .../iq/dataverse/api/NotificationsIT.java | 6 +++--- .../edu/harvard/iq/dataverse/api/PidsIT.java | 6 +++--- .../edu/harvard/iq/dataverse/api/ProvIT.java | 6 +++--- .../harvard/iq/dataverse/api/RemoteStoreIT.java | 4 ++-- .../edu/harvard/iq/dataverse/api/RolesIT.java | 6 +++--- .../edu/harvard/iq/dataverse/api/S3AccessIT.java | 8 ++++---- .../edu/harvard/iq/dataverse/api/SearchIT.java | 6 +++--- .../dataverse/api/SignedUrlAuthMechanismIT.java | 6 +++--- .../harvard/iq/dataverse/api/SignpostingIT.java | 8 ++++---- .../edu/harvard/iq/dataverse/api/SiteMapIT.java | 4 ++-- .../harvard/iq/dataverse/api/StorageSitesIT.java | 4 ++-- .../edu/harvard/iq/dataverse/api/SwordIT.java | 6 +++--- .../edu/harvard/iq/dataverse/api/TabularIT.java | 6 +++--- .../harvard/iq/dataverse/api/ThumbnailsIT.java | 2 +- .../edu/harvard/iq/dataverse/api/UsersIT.java | 10 +++++----- .../edu/harvard/iq/dataverse/api/UtilIT.java | 16 ++++++++-------- .../api/filesystem/FileRecordJobIT.java | 10 +++++----- .../dataverse/export/OpenAireExporterTest.java | 2 +- 56 files changed, 184 insertions(+), 184 deletions(-) diff --git a/pom.xml b/pom.xml index df8daa7e019..b4636c9aac6 100644 --- a/pom.xml +++ b/pom.xml @@ -573,9 +573,9 @@ test - com.jayway.restassured + io.rest-assured rest-assured - 2.4.0 + 5.3.1 test diff --git a/src/test/java/edu/harvard/iq/dataverse/api/AccessIT.java b/src/test/java/edu/harvard/iq/dataverse/api/AccessIT.java index b7bdb17ec83..3786f1351cf 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/AccessIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/AccessIT.java @@ -5,10 +5,10 @@ */ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import static com.jayway.restassured.RestAssured.given; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import static io.restassured.RestAssured.given; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import edu.harvard.iq.dataverse.DataFile; import edu.harvard.iq.dataverse.util.FileUtil; import java.io.IOException; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/AdminIT.java b/src/test/java/edu/harvard/iq/dataverse/api/AdminIT.java index c9d262f6437..767175e2a76 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/AdminIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/AdminIT.java @@ -1,8 +1,8 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import edu.harvard.iq.dataverse.DataFile; import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinAuthenticationProvider; import edu.harvard.iq.dataverse.authorization.providers.oauth2.impl.GitHubOAuth2AP; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/AuxiliaryFilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/AuxiliaryFilesIT.java index 08643b2f018..d57d7ea6d99 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/AuxiliaryFilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/AuxiliaryFilesIT.java @@ -1,8 +1,8 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import java.io.File; import java.io.IOException; import java.nio.file.Path; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/BagIT.java b/src/test/java/edu/harvard/iq/dataverse/api/BagIT.java index d3ca498e447..0a5ff740931 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/BagIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/BagIT.java @@ -1,7 +1,7 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.response.Response; import edu.harvard.iq.dataverse.engine.command.impl.LocalSubmitToArchiveCommand; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import static jakarta.ws.rs.core.Response.Status.CREATED; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/BatchImportIT.java b/src/test/java/edu/harvard/iq/dataverse/api/BatchImportIT.java index aa0fb0d4a1e..f20815437db 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/BatchImportIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/BatchImportIT.java @@ -1,9 +1,9 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.path.json.JsonPath; +import io.restassured.RestAssured; +import io.restassured.path.json.JsonPath; import java.io.File; -import com.jayway.restassured.response.Response; +import io.restassured.response.Response; import java.util.logging.Logger; import org.junit.BeforeClass; import org.junit.Test; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/BuiltinUsersIT.java b/src/test/java/edu/harvard/iq/dataverse/api/BuiltinUsersIT.java index 36a56950ec3..cf416d2afca 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/BuiltinUsersIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/BuiltinUsersIT.java @@ -1,10 +1,10 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import static com.jayway.restassured.RestAssured.given; -import com.jayway.restassured.http.ContentType; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import static io.restassured.RestAssured.given; +import io.restassured.http.ContentType; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import edu.harvard.iq.dataverse.api.auth.ApiKeyAuthMechanism; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import java.util.AbstractMap; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/ConfirmEmailIT.java b/src/test/java/edu/harvard/iq/dataverse/api/ConfirmEmailIT.java index e00dba2263b..0a3db70e5c6 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/ConfirmEmailIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/ConfirmEmailIT.java @@ -1,9 +1,9 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import static com.jayway.restassured.RestAssured.given; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import static io.restassured.RestAssured.given; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import java.util.logging.Logger; import static junit.framework.Assert.assertEquals; import org.junit.BeforeClass; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DataCiteIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DataCiteIT.java index 86c3eed4297..33cb5d3ea53 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DataCiteIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DataCiteIT.java @@ -1,7 +1,7 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import static junit.framework.Assert.assertEquals; import static org.hamcrest.CoreMatchers.equalTo; import org.junit.Test; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java index 69d9c78d602..e4fa9a52c32 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java @@ -1,7 +1,7 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.response.Response; import edu.harvard.iq.dataverse.api.auth.ApiKeyAuthMechanism; import org.junit.BeforeClass; import org.junit.Test; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java index 4929175b89c..1bf6c4ee6fe 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java @@ -1,11 +1,11 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; +import io.restassured.RestAssured; -import static com.jayway.restassured.RestAssured.given; +import static io.restassured.RestAssured.given; -import com.jayway.restassured.http.ContentType; -import com.jayway.restassured.response.Response; +import io.restassured.http.ContentType; +import io.restassured.response.Response; import java.util.logging.Logger; @@ -13,7 +13,7 @@ import org.junit.Test; import org.skyscreamer.jsonassert.JSONAssert; import org.junit.Ignore; -import com.jayway.restassured.path.json.JsonPath; +import io.restassured.path.json.JsonPath; import java.util.List; import java.util.Map; @@ -42,11 +42,11 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.exception.ExceptionUtils; -import com.jayway.restassured.parsing.Parser; +import io.restassured.parsing.Parser; -import static com.jayway.restassured.path.json.JsonPath.with; +import static io.restassured.path.json.JsonPath.with; -import com.jayway.restassured.path.xml.XmlPath; +import io.restassured.path.xml.XmlPath; import static edu.harvard.iq.dataverse.api.UtilIT.equalToCI; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java index eb8511f8ffe..cb684bc3506 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java @@ -1,9 +1,9 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import static com.jayway.restassured.RestAssured.given; -import static com.jayway.restassured.path.json.JsonPath.with; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import static io.restassured.RestAssured.given; +import static io.restassured.path.json.JsonPath.with; +import io.restassured.response.Response; import edu.harvard.iq.dataverse.Dataverse; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import edu.harvard.iq.dataverse.util.BundleUtil; @@ -31,7 +31,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.nio.file.Files; -import com.jayway.restassured.path.json.JsonPath; +import io.restassured.path.json.JsonPath; import org.hamcrest.CoreMatchers; import org.hamcrest.Matchers; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DeactivateUsersIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DeactivateUsersIT.java index 3ffca21d5e6..2a6d69e9c89 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DeactivateUsersIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DeactivateUsersIT.java @@ -1,8 +1,8 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import edu.harvard.iq.dataverse.authorization.DataverseRole; import java.util.ArrayList; import java.util.Collections; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DeleteUsersIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DeleteUsersIT.java index e4c72cf4e1d..91afb1b9d52 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DeleteUsersIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DeleteUsersIT.java @@ -1,8 +1,8 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import edu.harvard.iq.dataverse.authorization.DataverseRole; import java.io.File; import java.io.IOException; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DownloadFilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DownloadFilesIT.java index dc30c53c8e5..e414afdbe48 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DownloadFilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DownloadFilesIT.java @@ -1,9 +1,9 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Headers; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.http.Headers; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DuplicateFilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DuplicateFilesIT.java index 19adb7ba98f..93bb6637b18 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DuplicateFilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DuplicateFilesIT.java @@ -1,9 +1,9 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.parsing.Parser; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.parsing.Parser; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import java.io.File; import java.io.IOException; import java.nio.file.Files; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/EditDDIIT.java b/src/test/java/edu/harvard/iq/dataverse/api/EditDDIIT.java index 5295637dd4f..9c49350cfa6 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/EditDDIIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/EditDDIIT.java @@ -1,8 +1,8 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import edu.harvard.iq.dataverse.datavariable.VarGroup; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/ExternalToolsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/ExternalToolsIT.java index 4d78e535a9b..eca34b00f53 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/ExternalToolsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/ExternalToolsIT.java @@ -1,8 +1,8 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import java.io.File; import java.io.IOException; import java.io.StringReader; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FeedbackApiIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FeedbackApiIT.java index f61468e28ef..856f09733ff 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FeedbackApiIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FeedbackApiIT.java @@ -1,8 +1,8 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import jakarta.json.Json; import jakarta.json.JsonObjectBuilder; import static jakarta.ws.rs.core.Response.Status.CREATED; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FileMetadataIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FileMetadataIT.java index b05c81abf6a..72d070f0a03 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FileMetadataIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FileMetadataIT.java @@ -1,8 +1,8 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.http.ContentType; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.http.ContentType; +import io.restassured.response.Response; import org.apache.commons.io.IOUtils; import org.junit.After; import org.junit.AfterClass; @@ -12,7 +12,7 @@ import java.util.UUID; -import static com.jayway.restassured.RestAssured.given; +import static io.restassured.RestAssured.given; import static jakarta.ws.rs.core.Response.Status.OK; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.fail; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FileTypeDetectionIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FileTypeDetectionIT.java index aeab3c00777..82c07803543 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FileTypeDetectionIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FileTypeDetectionIT.java @@ -1,8 +1,8 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import jakarta.json.Json; import jakarta.json.JsonObjectBuilder; import static jakarta.ws.rs.core.Response.Status.CREATED; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java index cb13c49083d..137cbee6b36 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java @@ -1,15 +1,15 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.response.Response; import java.util.logging.Logger; import edu.harvard.iq.dataverse.api.auth.ApiKeyAuthMechanism; import org.junit.Test; import org.junit.BeforeClass; -import com.jayway.restassured.path.json.JsonPath; -import static com.jayway.restassured.path.json.JsonPath.with; -import com.jayway.restassured.path.xml.XmlPath; +import io.restassured.path.json.JsonPath; +import static io.restassured.path.json.JsonPath.with; +import io.restassured.path.xml.XmlPath; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import edu.harvard.iq.dataverse.util.BundleUtil; import edu.harvard.iq.dataverse.util.SystemConfig; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FitsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FitsIT.java index 66c81898090..f8e949b3211 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FitsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FitsIT.java @@ -1,8 +1,8 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import static com.jayway.restassured.path.json.JsonPath.with; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import static io.restassured.path.json.JsonPath.with; +import io.restassured.response.Response; import java.io.IOException; import java.util.List; import java.util.Map; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/HarvestingClientsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/HarvestingClientsIT.java index 3e36da415f3..73dc90fc9e2 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/HarvestingClientsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/HarvestingClientsIT.java @@ -2,11 +2,11 @@ import java.util.logging.Logger; -import com.jayway.restassured.RestAssured; -import static com.jayway.restassured.RestAssured.given; -import com.jayway.restassured.path.json.JsonPath; +import io.restassured.RestAssured; +import static io.restassured.RestAssured.given; +import io.restassured.path.json.JsonPath; import org.junit.Test; -import com.jayway.restassured.response.Response; +import io.restassured.response.Response; import static jakarta.ws.rs.core.Response.Status.CREATED; import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; import static jakarta.ws.rs.core.Response.Status.ACCEPTED; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/HarvestingServerIT.java b/src/test/java/edu/harvard/iq/dataverse/api/HarvestingServerIT.java index 65f35f76cb1..5ff18742ccb 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/HarvestingServerIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/HarvestingServerIT.java @@ -2,15 +2,15 @@ import java.util.logging.Level; import java.util.logging.Logger; -import com.jayway.restassured.RestAssured; -import static com.jayway.restassured.RestAssured.given; +import io.restassured.RestAssured; +import static io.restassured.RestAssured.given; import org.junit.BeforeClass; import org.junit.AfterClass; import org.junit.Test; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; -import com.jayway.restassured.response.Response; -import com.jayway.restassured.path.xml.XmlPath; -import com.jayway.restassured.path.xml.element.Node; +import io.restassured.response.Response; +import io.restassured.path.xml.XmlPath; +import io.restassured.path.xml.element.Node; import java.util.ArrayList; import java.util.Collections; import static jakarta.ws.rs.core.Response.Status.OK; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/InReviewWorkflowIT.java b/src/test/java/edu/harvard/iq/dataverse/api/InReviewWorkflowIT.java index ca082c5ce95..20fbcf698ae 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/InReviewWorkflowIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/InReviewWorkflowIT.java @@ -1,9 +1,9 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.path.xml.XmlPath; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.path.json.JsonPath; +import io.restassured.path.xml.XmlPath; +import io.restassured.response.Response; import edu.harvard.iq.dataverse.authorization.DataverseRole; import java.util.logging.Logger; import jakarta.json.Json; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/IndexIT.java b/src/test/java/edu/harvard/iq/dataverse/api/IndexIT.java index 72d834786a9..12608ac340c 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/IndexIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/IndexIT.java @@ -1,9 +1,9 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import static com.jayway.restassured.RestAssured.given; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import static io.restassured.RestAssured.given; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import static edu.harvard.iq.dataverse.api.UtilIT.API_TOKEN_HTTP_HEADER; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import java.util.ArrayList; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/InfoIT.java b/src/test/java/edu/harvard/iq/dataverse/api/InfoIT.java index 73a1171bf1b..2c782bc53ef 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/InfoIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/InfoIT.java @@ -1,7 +1,7 @@ package edu.harvard.iq.dataverse.api; -import static com.jayway.restassured.RestAssured.given; -import com.jayway.restassured.response.Response; +import static io.restassured.RestAssured.given; +import io.restassured.response.Response; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import org.junit.Test; import static org.hamcrest.CoreMatchers.equalTo; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/InvalidCharactersIT.java b/src/test/java/edu/harvard/iq/dataverse/api/InvalidCharactersIT.java index 63af8ea13e1..47a9cf66f62 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/InvalidCharactersIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/InvalidCharactersIT.java @@ -1,7 +1,7 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.response.Response; import java.io.File; import java.io.IOException; import java.nio.file.Path; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/IpGroupsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/IpGroupsIT.java index d73f07bd530..23adb9bc415 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/IpGroupsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/IpGroupsIT.java @@ -1,8 +1,8 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import edu.harvard.iq.dataverse.authorization.DataverseRole; import java.util.ArrayList; import java.util.List; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/LicensesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/LicensesIT.java index 4e2e5e117fc..a54a3133863 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/LicensesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/LicensesIT.java @@ -1,8 +1,8 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java b/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java index 5b0c8e56467..7b25d0cea44 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java @@ -1,8 +1,8 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import java.util.logging.Logger; import static jakarta.ws.rs.core.Response.Status.CREATED; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/LogoutIT.java b/src/test/java/edu/harvard/iq/dataverse/api/LogoutIT.java index eaa6fc5270f..76fc1e2161d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/LogoutIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/LogoutIT.java @@ -1,7 +1,7 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.response.Response; import org.junit.BeforeClass; import org.junit.jupiter.api.Test; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/MakeDataCountApiIT.java b/src/test/java/edu/harvard/iq/dataverse/api/MakeDataCountApiIT.java index c85920807fd..cc0df065e48 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/MakeDataCountApiIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/MakeDataCountApiIT.java @@ -1,7 +1,7 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.response.Response; import java.io.File; import java.io.IOException; import static jakarta.ws.rs.core.Response.Status.CREATED; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/MetadataBlocksIT.java b/src/test/java/edu/harvard/iq/dataverse/api/MetadataBlocksIT.java index f941cd0b0a9..c301e158b4e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/MetadataBlocksIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/MetadataBlocksIT.java @@ -1,7 +1,7 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.response.Response; import org.hamcrest.CoreMatchers; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/MetricsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/MetricsIT.java index cdbf2251ea3..4343ca5b6ac 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/MetricsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/MetricsIT.java @@ -1,7 +1,7 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.response.Response; import edu.harvard.iq.dataverse.metrics.MetricsUtil; import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; import static jakarta.ws.rs.core.Response.Status.OK; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/MoveIT.java b/src/test/java/edu/harvard/iq/dataverse/api/MoveIT.java index 537fe09317c..2fa059ce330 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/MoveIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/MoveIT.java @@ -1,9 +1,9 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.path.json.JsonPath; -import static com.jayway.restassured.path.json.JsonPath.with; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.path.json.JsonPath; +import static io.restassured.path.json.JsonPath.with; +import io.restassured.response.Response; import edu.harvard.iq.dataverse.authorization.DataverseRole; import java.io.StringReader; import java.util.List; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/NetcdfIT.java b/src/test/java/edu/harvard/iq/dataverse/api/NetcdfIT.java index 0b1862ad687..9cd06a22683 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/NetcdfIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/NetcdfIT.java @@ -1,8 +1,8 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import java.io.File; import java.io.IOException; import java.nio.file.Path; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/NotificationsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/NotificationsIT.java index f7955726b88..d2f94704b82 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/NotificationsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/NotificationsIT.java @@ -1,8 +1,8 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import java.util.logging.Logger; import static jakarta.ws.rs.core.Response.Status.CREATED; import static jakarta.ws.rs.core.Response.Status.OK; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/PidsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/PidsIT.java index 7983bf3708e..929b6e69137 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/PidsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/PidsIT.java @@ -1,8 +1,8 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import static jakarta.ws.rs.core.Response.Status.CREATED; import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; import static jakarta.ws.rs.core.Response.Status.OK; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/ProvIT.java b/src/test/java/edu/harvard/iq/dataverse/api/ProvIT.java index dc3c01099e3..7290658d00e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/ProvIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/ProvIT.java @@ -1,8 +1,8 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import jakarta.json.Json; import jakarta.json.JsonArray; import jakarta.json.JsonObject; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/RemoteStoreIT.java b/src/test/java/edu/harvard/iq/dataverse/api/RemoteStoreIT.java index 286013f7727..9f37c27cd09 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/RemoteStoreIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/RemoteStoreIT.java @@ -1,7 +1,7 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.response.Response; import jakarta.json.Json; import jakarta.json.JsonObjectBuilder; import static jakarta.ws.rs.core.Response.Status.CREATED; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/RolesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/RolesIT.java index d1e2ffb2426..49859c6fd00 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/RolesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/RolesIT.java @@ -1,9 +1,9 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import java.util.logging.Logger; import static junit.framework.Assert.assertEquals; import static org.hamcrest.CoreMatchers.equalTo; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/S3AccessIT.java b/src/test/java/edu/harvard/iq/dataverse/api/S3AccessIT.java index e39172b4c73..18a65f1a082 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/S3AccessIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/S3AccessIT.java @@ -1,9 +1,9 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import static com.jayway.restassured.RestAssured.given; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import static io.restassured.RestAssured.given; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import java.util.logging.Logger; import static jakarta.ws.rs.core.Response.Status.OK; import static junit.framework.Assert.assertEquals; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java b/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java index b6823ddbea4..1984ae7dafd 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java @@ -1,8 +1,8 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import java.util.logging.Level; import java.util.logging.Logger; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/SignedUrlAuthMechanismIT.java b/src/test/java/edu/harvard/iq/dataverse/api/SignedUrlAuthMechanismIT.java index 729b4f85e9f..ddd7873054b 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/SignedUrlAuthMechanismIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/SignedUrlAuthMechanismIT.java @@ -1,11 +1,11 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.response.Response; import org.junit.BeforeClass; import org.junit.jupiter.api.Test; -import static com.jayway.restassured.RestAssured.get; +import static io.restassured.RestAssured.get; import static jakarta.ws.rs.core.Response.Status.OK; import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/SignpostingIT.java b/src/test/java/edu/harvard/iq/dataverse/api/SignpostingIT.java index 585eac91d18..39959e7dce4 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/SignpostingIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/SignpostingIT.java @@ -1,10 +1,10 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.http.ContentType; +import io.restassured.RestAssured; +import io.restassured.http.ContentType; -import static com.jayway.restassured.RestAssured.given; -import com.jayway.restassured.response.Response; +import static io.restassured.RestAssured.given; +import io.restassured.response.Response; import edu.harvard.iq.dataverse.util.json.JsonUtil; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/SiteMapIT.java b/src/test/java/edu/harvard/iq/dataverse/api/SiteMapIT.java index 723f05d3802..017ad014ffb 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/SiteMapIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/SiteMapIT.java @@ -1,9 +1,9 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; +import io.restassured.RestAssured; import org.junit.BeforeClass; import org.junit.Test; -import com.jayway.restassured.response.Response; +import io.restassured.response.Response; public class SiteMapIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/StorageSitesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/StorageSitesIT.java index b2f6e6151a1..1d93205fddd 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/StorageSitesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/StorageSitesIT.java @@ -1,7 +1,7 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.response.Response; import edu.harvard.iq.dataverse.locality.StorageSite; import edu.harvard.iq.dataverse.util.SystemConfig; import jakarta.json.Json; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/SwordIT.java b/src/test/java/edu/harvard/iq/dataverse/api/SwordIT.java index 95d9525f6db..2c0dc7621dc 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/SwordIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/SwordIT.java @@ -1,8 +1,8 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import edu.harvard.iq.dataverse.api.datadeposit.SwordConfigurationImpl; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import java.io.File; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/TabularIT.java b/src/test/java/edu/harvard/iq/dataverse/api/TabularIT.java index 70267d70f5b..3442dddcf05 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/TabularIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/TabularIT.java @@ -1,8 +1,8 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import java.io.File; import java.util.Arrays; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/ThumbnailsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/ThumbnailsIT.java index ffa432de63b..c02b116f3b0 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/ThumbnailsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/ThumbnailsIT.java @@ -1,6 +1,6 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.response.Response; +import io.restassured.response.Response; import org.hamcrest.CoreMatchers; import org.junit.Test; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java index 76f153721c0..203b897ab01 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java @@ -1,10 +1,10 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.RestAssured; -import static com.jayway.restassured.RestAssured.given; -import com.jayway.restassured.http.ContentType; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import static io.restassured.RestAssured.given; +import io.restassured.http.ContentType; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import edu.harvard.iq.dataverse.authorization.DataverseRole; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import java.util.ArrayList; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java index 5f61ab3f2c7..c8be2bbf177 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -1,8 +1,8 @@ package edu.harvard.iq.dataverse.api; -import com.jayway.restassured.http.ContentType; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.http.ContentType; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import java.util.UUID; import java.util.logging.Logger; import jakarta.json.Json; @@ -19,12 +19,12 @@ import java.time.LocalDateTime; import java.util.logging.Level; import edu.harvard.iq.dataverse.api.datadeposit.SwordConfigurationImpl; -import com.jayway.restassured.path.xml.XmlPath; +import io.restassured.path.xml.XmlPath; import edu.harvard.iq.dataverse.mydata.MyDataFilterParams; import org.apache.commons.lang3.StringUtils; import org.junit.Test; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; -import com.jayway.restassured.specification.RequestSpecification; +import io.restassured.specification.RequestSpecification; import java.util.List; import com.mashape.unirest.http.Unirest; import com.mashape.unirest.http.exceptions.UnirestException; @@ -40,9 +40,9 @@ import org.hamcrest.Description; import org.hamcrest.Matcher; -import static com.jayway.restassured.RestAssured.put; -import static com.jayway.restassured.path.xml.XmlPath.from; -import static com.jayway.restassured.RestAssured.given; +import static io.restassured.RestAssured.put; +import static io.restassured.path.xml.XmlPath.from; +import static io.restassured.RestAssured.given; import edu.harvard.iq.dataverse.DatasetField; import edu.harvard.iq.dataverse.DatasetFieldType; import edu.harvard.iq.dataverse.DatasetFieldValue; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/filesystem/FileRecordJobIT.java b/src/test/java/edu/harvard/iq/dataverse/api/filesystem/FileRecordJobIT.java index 5cfce389ed6..6bec7575c23 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/filesystem/FileRecordJobIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/filesystem/FileRecordJobIT.java @@ -20,10 +20,10 @@ */ import com.fasterxml.jackson.databind.ObjectMapper; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.http.ContentType; -import com.jayway.restassured.path.json.JsonPath; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.http.ContentType; +import io.restassured.path.json.JsonPath; +import io.restassured.response.Response; import edu.harvard.iq.dataverse.api.UtilIT; import edu.harvard.iq.dataverse.authorization.DataverseRole; import edu.harvard.iq.dataverse.batch.entities.JobExecutionEntity; @@ -55,7 +55,7 @@ import java.util.Random; import java.util.UUID; -import static com.jayway.restassured.RestAssured.given; +import static io.restassured.RestAssured.given; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.fail; diff --git a/src/test/java/edu/harvard/iq/dataverse/export/OpenAireExporterTest.java b/src/test/java/edu/harvard/iq/dataverse/export/OpenAireExporterTest.java index aa1668201ba..9c6002a26db 100644 --- a/src/test/java/edu/harvard/iq/dataverse/export/OpenAireExporterTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/export/OpenAireExporterTest.java @@ -1,6 +1,6 @@ package edu.harvard.iq.dataverse.export; -import com.jayway.restassured.path.xml.XmlPath; +import io.restassured.path.xml.XmlPath; import edu.harvard.iq.dataverse.util.xml.XmlPrinter; import io.gdcc.spi.export.ExportDataProvider; import io.gdcc.spi.export.XMLExporter; From 27aaaf131ecdf04bab05ac53e87855670e5b3df1 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Mon, 7 Aug 2023 14:10:08 -0400 Subject: [PATCH 048/173] bump Java from 11 to 17 #8094 --- modules/dataverse-parent/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/dataverse-parent/pom.xml b/modules/dataverse-parent/pom.xml index 7c83ac39736..c7bb1896063 100644 --- a/modules/dataverse-parent/pom.xml +++ b/modules/dataverse-parent/pom.xml @@ -133,7 +133,7 @@ 5.14 - 11 + 17 UTF-8 -Xdoclint:none From 460ae7c1d21391fe577817fe72bb1f5810bea23e Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Mon, 7 Aug 2023 14:30:45 -0400 Subject: [PATCH 049/173] update docs for Java 17 #8094 container/dev-usage.rst has not been updated because it will be handled in PR #9761. --- doc/sphinx-guides/source/container/base-image.rst | 2 +- doc/sphinx-guides/source/installation/prerequisites.rst | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/sphinx-guides/source/container/base-image.rst b/doc/sphinx-guides/source/container/base-image.rst index ed06314ef0e..1a47a8fc413 100644 --- a/doc/sphinx-guides/source/container/base-image.rst +++ b/doc/sphinx-guides/source/container/base-image.rst @@ -41,7 +41,7 @@ Image Contents The base image provides: -- `Eclipse Temurin JRE using Java 11 `_ +- `Eclipse Temurin JRE using Java 17 `_ - `Payara Community Application Server `_ - CLI tools necessary to run Dataverse (i. e. ``curl`` or ``jq`` - see also :doc:`../installation/prerequisites` in Installation Guide) - Linux tools for analysis, monitoring and so on diff --git a/doc/sphinx-guides/source/installation/prerequisites.rst b/doc/sphinx-guides/source/installation/prerequisites.rst index b86bee9cd31..4624e2c268a 100644 --- a/doc/sphinx-guides/source/installation/prerequisites.rst +++ b/doc/sphinx-guides/source/installation/prerequisites.rst @@ -19,7 +19,7 @@ We assume you plan to run your Dataverse installation on Linux and we recommend Java ---- -The Dataverse Software requires Java SE 11 (or higher). +The Dataverse Software requires Java SE 17 (or higher). Installing Java =============== @@ -30,11 +30,11 @@ The Oracle JDK can be downloaded from http://www.oracle.com/technetwork/java/jav On a RHEL/derivative, install OpenJDK (devel version) using yum:: - # sudo yum install java-11-openjdk + # sudo yum install java-17-openjdk -If you have multiple versions of Java installed, Java 11 should be the default when ``java`` is invoked from the command line. You can test this by running ``java -version``. +If you have multiple versions of Java installed, Java 17 should be the default when ``java`` is invoked from the command line. You can test this by running ``java -version``. -On RHEL/derivative you can make Java 11 the default with the ``alternatives`` command, having it prompt you to select the version of Java from a list:: +On RHEL/derivative you can make Java 17 the default with the ``alternatives`` command, having it prompt you to select the version of Java from a list:: # alternatives --config java From 5a30f4d229c10d4fa0bd06acc5cf5875363c1996 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Mon, 7 Aug 2023 14:32:03 -0400 Subject: [PATCH 050/173] add release note for Java 17 #8094 --- doc/release-notes/8094-java-17.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/release-notes/8094-java-17.md diff --git a/doc/release-notes/8094-java-17.md b/doc/release-notes/8094-java-17.md new file mode 100644 index 00000000000..f3c81145465 --- /dev/null +++ b/doc/release-notes/8094-java-17.md @@ -0,0 +1 @@ +Java 17 or higher is now required. From ee7112e9b3b9d2b3abebde2c13f6757fffb0f769 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Mon, 7 Aug 2023 15:28:38 -0400 Subject: [PATCH 051/173] fix REST Assured test #8094 --- src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java b/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java index 1984ae7dafd..24faad34ac6 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java @@ -310,7 +310,7 @@ public void testSearchDynamicMetadataFields() { allFieldsFromCitation.then().assertThat() .body("data.items[0].metadataBlocks.citation.displayName", CoreMatchers.equalTo("Citation Metadata")) // Many fields returned, all of the citation block that has been filled in. - .body("data.items[0].metadataBlocks.citation.fields.typeName.size", Matchers.equalTo(5)) + .body("data.items[0].metadataBlocks.citation.fields", Matchers.hasSize(5)) .statusCode(OK.getStatusCode()); } From 2310df60693fe975d57cf2d5c993eb71fcb9aaca Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Mon, 7 Aug 2023 15:37:24 -0400 Subject: [PATCH 052/173] update to new REST Assured behavior #8094 --- src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java index 1bf6c4ee6fe..0d67333b153 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java @@ -670,9 +670,7 @@ public void testExport() { exportDatasetAsDdi.then().assertThat() .statusCode(OK.getStatusCode()); - // This is now returning [] instead of sammi@sample.com. Not sure why. - // :ExcludeEmailFromExport is absent so the email should be shown. - assertEquals("[]", XmlPath.from(exportDatasetAsDdi.body().asString()).getString("codeBook.stdyDscr.stdyInfo.contact.@email")); + assertEquals(null, XmlPath.from(exportDatasetAsDdi.body().asString()).getString("codeBook.stdyDscr.stdyInfo.contact.@email")); assertEquals(datasetPersistentId, XmlPath.from(exportDatasetAsDdi.body().asString()).getString("codeBook.docDscr.citation.titlStmt.IDNo")); Response reexportAllFormats = UtilIT.reexportDatasetAllFormats(datasetPersistentId); From dc4d1c11d0b4dfcefc61309bab176a7178d17a25 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Mon, 7 Aug 2023 16:18:00 -0400 Subject: [PATCH 053/173] bump maven unit tests to Java 17 #8094 --- .github/workflows/maven_unit_test.yml | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/.github/workflows/maven_unit_test.yml b/.github/workflows/maven_unit_test.yml index 45beabf3193..5a7a7f73a71 100644 --- a/.github/workflows/maven_unit_test.yml +++ b/.github/workflows/maven_unit_test.yml @@ -22,18 +22,9 @@ jobs: strategy: fail-fast: false matrix: - jdk: [ '11' ] + jdk: [ '17' ] experimental: [false] status: ["Stable"] - # - # JDK 17 builds disabled due to non-essential fails marking CI jobs as completely failed within - # Github Projects, PR lists etc. This was consensus on Slack #dv-tech. See issue #8094 - # (This is a limitation of how Github is currently handling these things.) - # - #include: - # - jdk: '17' - # experimental: true - # status: "Experimental" continue-on-error: ${{ matrix.experimental }} runs-on: ubuntu-latest steps: From 1b47e78ee007a0786eadcdbf0aeff4b51cc566fe Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Mon, 16 Jan 2023 22:27:52 +0100 Subject: [PATCH 054/173] fix(storage): avoid NPE when building path to local storage dir During unit testing it occured that sometimes parts of paths are null (there was a missing mock for authority). Changing the code structure here to catch this anytime. This hard to track cause of trouble was revealed when running tests with JDK 17, because since JDK 16 all java.nio.file.Path may not contain null elements for the first component. See also: https://stackoverflow.com/questions/68791709 --- .../iq/dataverse/dataaccess/FileAccessIO.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/dataaccess/FileAccessIO.java b/src/main/java/edu/harvard/iq/dataverse/dataaccess/FileAccessIO.java index 8ee3f0cf53c..d95df1567bd 100644 --- a/src/main/java/edu/harvard/iq/dataverse/dataaccess/FileAccessIO.java +++ b/src/main/java/edu/harvard/iq/dataverse/dataaccess/FileAccessIO.java @@ -565,21 +565,26 @@ private String getDatasetDirectory() throws IOException { if (isDirectAccess()) { throw new IOException("No DvObject defined in the Data Access Object"); } - - Path datasetDirectoryPath=null; + String authorityForFS = null; + String identifierForFS = null; if (dvObject instanceof Dataset) { - datasetDirectoryPath = Paths.get(this.getDataset().getAuthorityForFileStorage(), this.getDataset().getIdentifierForFileStorage()); + authorityForFS = this.getDataset().getAuthorityForFileStorage(); + identifierForFS = this.getDataset().getIdentifierForFileStorage(); } else if (dvObject instanceof DataFile) { - datasetDirectoryPath = Paths.get(this.getDataFile().getOwner().getAuthorityForFileStorage(), this.getDataFile().getOwner().getIdentifierForFileStorage()); + authorityForFS = this.getDataFile().getOwner().getAuthorityForFileStorage(); + identifierForFS = this.getDataFile().getOwner().getIdentifierForFileStorage(); } else if (dvObject instanceof Dataverse) { throw new IOException("FileAccessIO: Dataverses are not a supported dvObject"); } - - if (datasetDirectoryPath == null) { + + if (authorityForFS == null || identifierForFS == null) { throw new IOException("Could not determine the filesystem directory of the parent dataset."); } - String datasetDirectory = Paths.get(getFilesRootDirectory(), datasetDirectoryPath.toString()).toString(); + + // Determine the final directory tree. As of JDK 16, the first component of the path MUST be non-null + // (we check for that via the setting), but also the others make no sense if they are null. + String datasetDirectory = Paths.get(getFilesRootDirectory(), authorityForFS, identifierForFS).toString(); if (dvObject.getStorageIdentifier() == null || dvObject.getStorageIdentifier().isEmpty()) { throw new IOException("Data Access: No local storage identifier defined for this datafile."); From c1b57a168cf363d48eabbd3051cd11104bd5c570 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Tue, 8 Aug 2023 08:34:00 -0400 Subject: [PATCH 055/173] testCreateNewStorageIO_createsFileAccessIObyDefault #8094 Get this test to pass: DataAccessTest#testCreateNewStorageIO_createsFileAccessIObyDefault --- src/test/java/edu/harvard/iq/dataverse/mocks/MocksFactory.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/edu/harvard/iq/dataverse/mocks/MocksFactory.java b/src/test/java/edu/harvard/iq/dataverse/mocks/MocksFactory.java index 7d6e663a547..927d288d660 100644 --- a/src/test/java/edu/harvard/iq/dataverse/mocks/MocksFactory.java +++ b/src/test/java/edu/harvard/iq/dataverse/mocks/MocksFactory.java @@ -143,6 +143,7 @@ public static Dataset makeDataset() { Dataset ds = new Dataset(); ds.setId( nextId() ); ds.setIdentifier("sample-ds-" + ds.getId() ); + ds.setAuthority("10.5072"); ds.setCategoriesByName( Arrays.asList("CatOne", "CatTwo", "CatThree") ); final List files = makeFiles(10); final List metadatas = new ArrayList<>(10); From d9a90f2ce443e5f9c04a8a40f3ffc33fd922420c Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Tue, 8 Aug 2023 09:03:53 -0400 Subject: [PATCH 056/173] bump to Java 17 in container base push workflow #8094 --- .github/workflows/container_base_push.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/container_base_push.yml b/.github/workflows/container_base_push.yml index 5c62fb0c811..b938851f816 100644 --- a/.github/workflows/container_base_push.yml +++ b/.github/workflows/container_base_push.yml @@ -34,7 +34,7 @@ jobs: packages: read strategy: matrix: - jdk: [ '11' ] + jdk: [ '17' ] # Only run in upstream repo - avoid unnecessary runs in forks if: ${{ github.repository_owner == 'IQSS' }} From 7274eefc95c2fa5b2117fe7211b99d6f96f3af58 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Tue, 8 Aug 2023 09:17:16 -0400 Subject: [PATCH 057/173] bump GitHub Actions workflows to Java 17 #8094 --- .github/workflows/container_app_pr.yml | 2 +- .github/workflows/container_app_push.yml | 6 +++--- .github/workflows/deploy_beta_testing.yml | 2 +- .github/workflows/spi_release.yml | 8 ++++---- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/container_app_pr.yml b/.github/workflows/container_app_pr.yml index 9e514690a13..c86d284e74b 100644 --- a/.github/workflows/container_app_pr.yml +++ b/.github/workflows/container_app_pr.yml @@ -25,7 +25,7 @@ jobs: ref: 'refs/pull/${{ github.event.client_payload.pull_request.number }}/merge' - uses: actions/setup-java@v3 with: - java-version: "11" + java-version: "17" distribution: 'adopt' - uses: actions/cache@v3 with: diff --git a/.github/workflows/container_app_push.yml b/.github/workflows/container_app_push.yml index c60691b1c85..5665d104458 100644 --- a/.github/workflows/container_app_push.yml +++ b/.github/workflows/container_app_push.yml @@ -36,10 +36,10 @@ jobs: - name: Checkout repository uses: actions/checkout@v3 - - name: Set up JDK 11 + - name: Set up JDK uses: actions/setup-java@v3 with: - java-version: "11" + java-version: "17" distribution: temurin cache: maven @@ -105,7 +105,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-java@v3 with: - java-version: "11" + java-version: "17" distribution: temurin # Depending on context, we push to different targets. Login accordingly. diff --git a/.github/workflows/deploy_beta_testing.yml b/.github/workflows/deploy_beta_testing.yml index 3e67bfe426e..f94c01a2911 100644 --- a/.github/workflows/deploy_beta_testing.yml +++ b/.github/workflows/deploy_beta_testing.yml @@ -16,7 +16,7 @@ jobs: - uses: actions/setup-java@v3 with: distribution: 'zulu' - java-version: '11' + java-version: '17' - name: Build application war run: mvn package diff --git a/.github/workflows/spi_release.yml b/.github/workflows/spi_release.yml index 1fbf05ce693..2bcdbf2f924 100644 --- a/.github/workflows/spi_release.yml +++ b/.github/workflows/spi_release.yml @@ -40,7 +40,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-java@v3 with: - java-version: '11' + java-version: '17' distribution: 'adopt' server-id: ossrh server-username: MAVEN_USERNAME @@ -66,7 +66,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-java@v3 with: - java-version: '11' + java-version: '17' distribution: 'adopt' - uses: actions/cache@v2 with: @@ -78,7 +78,7 @@ jobs: - name: Set up Maven Central Repository uses: actions/setup-java@v3 with: - java-version: '11' + java-version: '17' distribution: 'adopt' server-id: ossrh server-username: MAVEN_USERNAME @@ -91,4 +91,4 @@ jobs: env: MAVEN_USERNAME: ${{ secrets.DATAVERSEBOT_SONATYPE_USERNAME }} MAVEN_PASSWORD: ${{ secrets.DATAVERSEBOT_SONATYPE_TOKEN }} - MAVEN_GPG_PASSPHRASE: ${{ secrets.DATAVERSEBOT_GPG_PASSWORD }} \ No newline at end of file + MAVEN_GPG_PASSPHRASE: ${{ secrets.DATAVERSEBOT_GPG_PASSWORD }} From 078c554db96f1e57d67d3aae3aedd95f057af52e Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Tue, 8 Aug 2023 09:30:48 -0400 Subject: [PATCH 058/173] remove Perl installer from Makefile #8305 The Perl installer was removed in b829ca7a --- scripts/installer/Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/installer/Makefile b/scripts/installer/Makefile index d40d4d792ea..a1fbfab782e 100644 --- a/scripts/installer/Makefile +++ b/scripts/installer/Makefile @@ -7,7 +7,6 @@ JHOVE_SCHEMA=${INSTALLER_ZIP_DIR}/jhoveConfig.xsd SOLR_SCHEMA=${INSTALLER_ZIP_DIR}/schema.xml ${INSTALLER_ZIP_DIR}/update-fields.sh SOLR_CONFIG=${INSTALLER_ZIP_DIR}/solrconfig.xml PYTHON_FILES=${INSTALLER_ZIP_DIR}/README_python.txt ${INSTALLER_ZIP_DIR}/installConfig.py ${INSTALLER_ZIP_DIR}/installUtils.py ${INSTALLER_ZIP_DIR}/install.py ${INSTALLER_ZIP_DIR}/installAppServer.py ${INSTALLER_ZIP_DIR}/requirements.txt ${INSTALLER_ZIP_DIR}/default.config ${INSTALLER_ZIP_DIR}/interactive.config -INSTALL_SCRIPT=${INSTALLER_ZIP_DIR}/install installer: dvinstall.zip From b798ae90fe78bf8ef99a7a0a1e7c66a840d91d94 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Tue, 8 Aug 2023 13:54:58 -0400 Subject: [PATCH 059/173] start docker #9616 --- doc/sphinx-guides/source/developers/dev-environment.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/sphinx-guides/source/developers/dev-environment.rst b/doc/sphinx-guides/source/developers/dev-environment.rst index dd65a3abc14..a4e79c3bb75 100755 --- a/doc/sphinx-guides/source/developers/dev-environment.rst +++ b/doc/sphinx-guides/source/developers/dev-environment.rst @@ -41,11 +41,13 @@ Install Maven Follow instructions at https://maven.apache.org -Install Docker -~~~~~~~~~~~~~~ +Install and Start Docker +~~~~~~~~~~~~~~~~~~~~~~~~ Follow instructions at https://www.docker.com +Be sure to start Docker. + Git Clone Repo ~~~~~~~~~~~~~~ From 3716c5c4ffe9c2a02a3690e7ff6bba9d3a4590b9 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Tue, 8 Aug 2023 23:04:07 +0200 Subject: [PATCH 060/173] fix(ui): make file page citation download widget JSF 4 compliant The backing bean actions were attached to normal "" elements, which means they were executed on page load and not, as expected, via JavaScript onClick. Former versions of JSF were less strict, now we need to use the standard compliant "" --- src/main/webapp/file.xhtml | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/main/webapp/file.xhtml b/src/main/webapp/file.xhtml index 626a2580f98..06dfe66ede1 100644 --- a/src/main/webapp/file.xhtml +++ b/src/main/webapp/file.xhtml @@ -110,19 +110,22 @@ From aabc45d78581d2cf8640a50f7024892e8e0fb5b1 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Tue, 8 Aug 2023 23:56:17 +0200 Subject: [PATCH 061/173] fix(ui): make more file page citation download widget JSF 4 compliant The widget for the dataset citation on the file page was forgotten to be converted to as well to avoid action execution on page load. --- src/main/webapp/file.xhtml | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/main/webapp/file.xhtml b/src/main/webapp/file.xhtml index 06dfe66ede1..5a60afef60c 100644 --- a/src/main/webapp/file.xhtml +++ b/src/main/webapp/file.xhtml @@ -123,7 +123,7 @@
  • @@ -159,19 +159,22 @@ From 8993d9ad48c77dc97b9c0ce3e38eef67c5ee568d Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Wed, 9 Aug 2023 16:34:53 -0400 Subject: [PATCH 062/173] add no-op editFileMetadata() to FilePage to prevent errors #8305 As of Payara 6/JSF 4/Jakarta EE 10, this syntax doesn't work: action="#{bean[editFileAction]()}" (Or it logs errors in server.log at the very least.) So we switch to this syntax: action=#{bean.editFileMetadata()}" This means we have to make sure the method exists on all the beans, though, or we get errors. (It's unclear why we weren't seeing errors before!) So we add the method to FilePage, which gets passed as bean. We also remove the now unused "editFileAction". --- src/main/java/edu/harvard/iq/dataverse/FilePage.java | 9 +++++++++ src/main/webapp/file-edit-button-fragment.xhtml | 3 +-- src/main/webapp/filesFragment.xhtml | 1 - 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/FilePage.java b/src/main/java/edu/harvard/iq/dataverse/FilePage.java index 018c88691ce..49c904c3ac3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FilePage.java +++ b/src/main/java/edu/harvard/iq/dataverse/FilePage.java @@ -1246,4 +1246,13 @@ public boolean isHasPublicStore() { return settingsWrapper.isTrueForKey(SettingsServiceBean.Key.PublicInstall, StorageIO.isPublicStore(DataAccess.getStorageDriverFromIdentifier(file.getStorageIdentifier()))); } + /** + * This method only exists because in file-edit-button-fragment.xhtml we + * call bean.editFileMetadata() and we need both FilePage (this bean) and + * DatasetPage to have the method defined to prevent errors in server.log. + */ + public String editFileMetadata(){ + return ""; + } + } diff --git a/src/main/webapp/file-edit-button-fragment.xhtml b/src/main/webapp/file-edit-button-fragment.xhtml index 8531f413b38..a31438f8e06 100644 --- a/src/main/webapp/file-edit-button-fragment.xhtml +++ b/src/main/webapp/file-edit-button-fragment.xhtml @@ -25,7 +25,6 @@ configureTools - for single file, list of configureTools for the file bean - the named value of the backing bean for the below method(s), also used by isFilePg param unrestrictFileAction - name of the method on the above bean to call for unrestrict (method must take a boolean) - editFileAction - for selected files, name of method on the above bean to send for edit metadata refreshTagsPopoupAction - for selected files, name of method on the above bean to refresh tags popup --> @@ -38,7 +37,7 @@ + action="#{bean.editFileMetadata()}"> diff --git a/src/main/webapp/filesFragment.xhtml b/src/main/webapp/filesFragment.xhtml index cdb6af88cd3..6d3c6062ec7 100644 --- a/src/main/webapp/filesFragment.xhtml +++ b/src/main/webapp/filesFragment.xhtml @@ -421,7 +421,6 @@ - From 8b3daf54218a5fbc4a16749e3fc7da35466d925f Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Fri, 11 Aug 2023 05:33:34 -0400 Subject: [PATCH 063/173] dev guide: bump Java from 11 to 17 #8094 --- doc/sphinx-guides/source/developers/dev-environment.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/sphinx-guides/source/developers/dev-environment.rst b/doc/sphinx-guides/source/developers/dev-environment.rst index a4e79c3bb75..1301994cc82 100755 --- a/doc/sphinx-guides/source/developers/dev-environment.rst +++ b/doc/sphinx-guides/source/developers/dev-environment.rst @@ -12,7 +12,7 @@ These instructions are oriented around Docker but the "classic" instructions we Quickstart ---------- -First, install Java 11, Maven, and Docker. +First, install Java 17, Maven, and Docker. After cloning the `dataverse repo `_, run this: @@ -30,7 +30,7 @@ Detailed Steps Install Java ~~~~~~~~~~~~ -The Dataverse Software requires Java 11. +The Dataverse Software requires Java 17. On Mac and Windows, we suggest downloading OpenJDK from https://adoptium.net (formerly `AdoptOpenJDK `_) or `SDKMAN `_. From e3da19f3088312d5394dd0541f19dd67b89e2d2d Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Fri, 11 Aug 2023 16:54:21 -0400 Subject: [PATCH 064/173] add upgrade instructions for Payara 5 to 6 #9340 --- doc/release-notes/9340-payara5to6.md | 95 ++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 doc/release-notes/9340-payara5to6.md diff --git a/doc/release-notes/9340-payara5to6.md b/doc/release-notes/9340-payara5to6.md new file mode 100644 index 00000000000..360834217ef --- /dev/null +++ b/doc/release-notes/9340-payara5to6.md @@ -0,0 +1,95 @@ +## Upgrade from Payara 5 to Payara 6 + +1. Download Payara 6.2023.7 as of this writing: + + `curl -L -O https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/6.2023.7/payara-6.2023.7.zip` + +1. Unzip it to /usr/local (or your preferred location) + + `sudo unzip payara-6.2023.7.zip -d /usr/local/` + +1. Change ownership of the unzipped Payara to your "service" user ("dataverse" by default) + + `sudo chown -R dataverse /usr/local/payara6` + +1. Undeploy Dataverse (if deployed; version 5.14 is assumed in the example below) + + `sudo /usr/local/payara5/bin/asadmin list-applications` + + `sudo /usr/local/payara5/bin/asadmin undeploy dataverse-5.14` + +1. Stop Payara 5 + + `sudo /usr/local/payara5/bin/asadmin stop-domain` + +1. Copy Dataverse-related lines from Payara 5 to Payara 6 domain.xml + + `sudo cp /usr/local/payara6/glassfish/domains/domain1/config/domain.xml /usr/local/payara6/glassfish/domains/domain1/config/domain.xml.orig` + + `sudo egrep 'dataverse|doi' /usr/local/payara5/glassfish/domains/domain1/config/domain.xml > lines.txt` + + `sudo vi /usr/local/payara6/glassfish/domains/domain1/config/domain.xml` + + The lines will be part of three sections, shown below, but your content will vary. + + Section 1: mail resource (under ``) + + ``` + + ``` + + Section 2: system properties (under ``) + + ``` + + + + + + ``` + + Section 3: JVM options (under ``) + + ``` + -Ddataverse.files.directory=/usr/local/dvn/data + -Ddataverse.files.file.type=file + -Ddataverse.files.file.label=file + -Ddataverse.files.file.directory=/usr/local/dvn/data + -Ddataverse.rserve.host=localhost + -Ddataverse.rserve.port=6311 + -Ddataverse.rserve.user=rserve + -Ddataverse.rserve.password=rserve + -Ddataverse.auth.password-reset-timeout-in-minutes=60 + -Ddataverse.timerServer=true + -Ddataverse.fqdn=dev1.dataverse.org + -Ddataverse.siteUrl=https://dev1.dataverse.org + -Ddataverse.files.storage-driver-id=file + -Ddoi.username=testaccount + -Ddoi.password=notmypassword + -Ddoi.baseurlstring=https://mds.test.datacite.org/ + -Ddoi.dataciterestapiurlstring=https://api.test.datacite.org + ``` + +1. Copy jhove.conf from Payara 5, edit and change payara5 to payara6 + + `sudo cp /usr/local/payara5/glassfish/domains/domain1/config/jhove.conf /usr/local/payara6/glassfish/domains/domain1/config/jhove.conf` + + `sudo chown dataverse /usr/local/payara6/glassfish/domains/domain1/config/jhove.conf` + + `sudo -u dataverse vi /usr/local/payara6/glassfish/domains/domain1/config/jhove.conf` + +1. Start Payara: + + `sudo -u dataverse /usr/local/payara6/bin/asadmin start-domain` + +1. Deploy the Dataverse 6.0 warfile: + + `sudo -u dataverse /usr/local/payara6/bin/asadmin deploy /path/to/dataverse-6.0.war` + +1. Check that you get a version number from Dataverse: + + `curl http://localhost:8080/api/info/version` + +1. Create the network listener on port 8009 + + `sudo -u dataverse /usr/local/payara6/bin/asadmin create-network-listener --protocol http-listener-1 --listenerport 8009 --jkenabled true jk-connector` \ No newline at end of file From e86d2f2a003058a46eabe49244749f164f40dbe2 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Fri, 11 Aug 2023 00:20:51 +0200 Subject: [PATCH 065/173] ci(ct): fix not pushing feature branches to Docker Hub #9769 By ensuring pushes to Docker Hub are only executed when based on develop or master branch, we avoid breaking the images on the Hub: simply skip the deploy job on wrong pushed to branch. --- .github/workflows/container_app_push.yml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/container_app_push.yml b/.github/workflows/container_app_push.yml index c60691b1c85..cc9d9926e61 100644 --- a/.github/workflows/container_app_push.yml +++ b/.github/workflows/container_app_push.yml @@ -99,8 +99,12 @@ jobs: name: "Package & Publish" runs-on: ubuntu-latest # Only run this job if we have access to secrets. This is true for events like push/schedule which run in - # context of main repo, but for PRs only true if coming from the main repo! Forks have no secret access. - if: needs.check-secrets.outputs.available == 'true' + # context of the main repo, but for PRs only true if coming from the main repo! Forks have no secret access. + # + # Note: The team's decision was to not auto-deploy an image on any git push where no PR exists (yet). + # Accordingly, only run for push events on branches develop and master. + if: needs.check-secrets.outputs.available == 'true' && + ( github.event_name != 'push' || ( github.event_name == 'push' && contains(fromJSON('["develop", "master"]'), github.ref_name))) steps: - uses: actions/checkout@v3 - uses: actions/setup-java@v3 @@ -109,7 +113,7 @@ jobs: distribution: temurin # Depending on context, we push to different targets. Login accordingly. - - if: ${{ github.event_name != 'pull_request' }} + - if: github.event_name != 'pull_request' name: Log in to Docker Hub registry uses: docker/login-action@v2 with: From b8e116ad39b88e888c6e13cae7dfb0318056598c Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Fri, 11 Aug 2023 00:22:28 +0200 Subject: [PATCH 066/173] ci(spi): fix typos in GH action to run only on selected branches --- .github/workflows/spi_release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/spi_release.yml b/.github/workflows/spi_release.yml index 1fbf05ce693..0d584693ccf 100644 --- a/.github/workflows/spi_release.yml +++ b/.github/workflows/spi_release.yml @@ -2,12 +2,12 @@ name: Dataverse SPI on: push: - branch: + branches: - "develop" paths: - "modules/dataverse-spi/**" pull_request: - branch: + branches: - "develop" paths: - "modules/dataverse-spi/**" From 548dd9993fe041717e7f0d7e772021dd4fbbced0 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Mon, 14 Aug 2023 15:27:55 -0400 Subject: [PATCH 067/173] update Solr 8.11.1 to 9.3.0 (minus config) #9260 Update all Solr references from 8.11.1 to 9.3.0 and make sure you can spin up containers. schema.xml was copied from solr-9.3.0/server/solr/configsets/_default/conf/managed-schema.xml (Note managed-schema.xml as there is no schema.xml upstream.) solrconfig.xml was copied from solr-9.3.0/server/solr/configsets/_default/conf/solrconfig.xml API tests will fail, of course, because we have not yet added our Dataverse-specific config. We'll be moving it from these files and then deleting them: conf/solr/8.11.1/schema.xml conf/solr/8.11.1/solrconfig.xml --- .env | 2 +- conf/solr/8.11.1/readme.md | 1 - conf/solr/9.3.0/schema.xml | 1033 +++++++++++++++ conf/solr/9.3.0/solrconfig.xml | 1121 +++++++++++++++++ conf/solr/{8.11.1 => 9.3.0}/update-fields.sh | 0 .../installation/files/etc/init.d/solr | 2 +- .../files/etc/systemd/solr.service | 6 +- .../source/admin/metadatacustomization.rst | 4 +- .../source/developers/classic-dev-env.rst | 16 +- .../source/installation/prerequisites.rst | 16 +- downloads/download.sh | 2 +- modules/container-configbaker/assembly.xml | 4 +- modules/dataverse-parent/pom.xml | 2 +- scripts/installer/Makefile | 8 +- scripts/vagrant/setup-solr.sh | 12 +- scripts/vagrant/setup.sh | 2 +- tests/shell/spec/update_fields_spec.sh | 6 +- 17 files changed, 2195 insertions(+), 42 deletions(-) delete mode 100644 conf/solr/8.11.1/readme.md create mode 100644 conf/solr/9.3.0/schema.xml create mode 100644 conf/solr/9.3.0/solrconfig.xml rename conf/solr/{8.11.1 => 9.3.0}/update-fields.sh (100%) diff --git a/.env b/.env index 3467f8df73b..e3ececc2e54 100644 --- a/.env +++ b/.env @@ -1,4 +1,4 @@ APP_IMAGE=gdcc/dataverse:unstable POSTGRES_VERSION=13 DATAVERSE_DB_USER=dataverse -SOLR_VERSION=8.11.1 +SOLR_VERSION=9.3.0 diff --git a/conf/solr/8.11.1/readme.md b/conf/solr/8.11.1/readme.md deleted file mode 100644 index 4457cf9a7df..00000000000 --- a/conf/solr/8.11.1/readme.md +++ /dev/null @@ -1 +0,0 @@ -Please see the dev guide for what to do with Solr config files. \ No newline at end of file diff --git a/conf/solr/9.3.0/schema.xml b/conf/solr/9.3.0/schema.xml new file mode 100644 index 00000000000..47319dc96ef --- /dev/null +++ b/conf/solr/9.3.0/schema.xml @@ -0,0 +1,1033 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/conf/solr/9.3.0/solrconfig.xml b/conf/solr/9.3.0/solrconfig.xml new file mode 100644 index 00000000000..b56305e6529 --- /dev/null +++ b/conf/solr/9.3.0/solrconfig.xml @@ -0,0 +1,1121 @@ + + + + + + + + + 9.7 + + + + + + + + + + + ${solr.data.dir:} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${solr.lock.type:native} + + + + + + + + + + + + + + + + + + + + + ${solr.ulog.dir:} + ${solr.ulog.numVersionBuckets:65536} + + + + + ${solr.autoCommit.maxTime:15000} + false + + + + + + ${solr.autoSoftCommit.maxTime:-1} + + + + + + + + + + + + + + ${solr.max.booleanClauses:1024} + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + 20 + + + 200 + + + + + + + + + + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + explicit + 10 + + + + + + + explicit + json + true + + + + + + + _text_ + + + + + + + text_general + + + + + + default + _text_ + solr.DirectSolrSpellChecker + + internal + + 0.5 + + 2 + + 1 + + 5 + + 4 + + 0.01 + + + + + + + + + + + + default + on + true + 10 + 5 + 5 + true + true + 10 + 5 + + + spellcheck + + + + + + + + + + + + 100 + + + + + + + + 70 + + 0.5 + + [-\w ,/\n\"']{20,200} + + + + + + + ]]> + ]]> + + + + + + + + + + + + + + + + + + + + + + + + ,, + ,, + ,, + ,, + ,]]> + ]]> + + + + + + 10 + .,!? + + + + + + + WORD + + + en + US + + + + + + + + + + + + [^\w-\.] + _ + + + + + + + yyyy-MM-dd['T'[HH:mm[:ss[.SSS]][z + yyyy-MM-dd['T'[HH:mm[:ss[,SSS]][z + yyyy-MM-dd HH:mm[:ss[.SSS]][z + yyyy-MM-dd HH:mm[:ss[,SSS]][z + [EEE, ]dd MMM yyyy HH:mm[:ss] z + EEEE, dd-MMM-yy HH:mm:ss z + EEE MMM ppd HH:mm:ss [z ]yyyy + + + + + java.lang.String + text_general + + *_str + 256 + + + true + + + java.lang.Boolean + booleans + + + java.util.Date + pdates + + + java.lang.Long + java.lang.Integer + plongs + + + java.lang.Number + pdoubles + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/conf/solr/8.11.1/update-fields.sh b/conf/solr/9.3.0/update-fields.sh similarity index 100% rename from conf/solr/8.11.1/update-fields.sh rename to conf/solr/9.3.0/update-fields.sh diff --git a/doc/sphinx-guides/source/_static/installation/files/etc/init.d/solr b/doc/sphinx-guides/source/_static/installation/files/etc/init.d/solr index 7ca04cdff3f..9cf8902eb14 100755 --- a/doc/sphinx-guides/source/_static/installation/files/etc/init.d/solr +++ b/doc/sphinx-guides/source/_static/installation/files/etc/init.d/solr @@ -5,7 +5,7 @@ # chkconfig: 35 92 08 # description: Starts and stops Apache Solr -SOLR_DIR="/usr/local/solr/solr-8.11.1" +SOLR_DIR="/usr/local/solr/solr-9.3.0" SOLR_COMMAND="bin/solr" SOLR_ARGS="-m 1g -j jetty.host=127.0.0.1" SOLR_USER=solr diff --git a/doc/sphinx-guides/source/_static/installation/files/etc/systemd/solr.service b/doc/sphinx-guides/source/_static/installation/files/etc/systemd/solr.service index d89ee108377..0b8a8528490 100644 --- a/doc/sphinx-guides/source/_static/installation/files/etc/systemd/solr.service +++ b/doc/sphinx-guides/source/_static/installation/files/etc/systemd/solr.service @@ -5,9 +5,9 @@ After = syslog.target network.target remote-fs.target nss-lookup.target [Service] User = solr Type = forking -WorkingDirectory = /usr/local/solr/solr-8.11.1 -ExecStart = /usr/local/solr/solr-8.11.1/bin/solr start -m 1g -j "jetty.host=127.0.0.1" -ExecStop = /usr/local/solr/solr-8.11.1/bin/solr stop +WorkingDirectory = /usr/local/solr/solr-9.3.0 +ExecStart = /usr/local/solr/solr-9.3.0/bin/solr start -m 1g -j "jetty.host=127.0.0.1" +ExecStop = /usr/local/solr/solr-9.3.0/bin/solr stop LimitNOFILE=65000 LimitNPROC=65000 Restart=on-failure diff --git a/doc/sphinx-guides/source/admin/metadatacustomization.rst b/doc/sphinx-guides/source/admin/metadatacustomization.rst index 53bc32eca3d..495e0a6f34e 100644 --- a/doc/sphinx-guides/source/admin/metadatacustomization.rst +++ b/doc/sphinx-guides/source/admin/metadatacustomization.rst @@ -516,7 +516,7 @@ the Solr schema configuration, including any enabled metadata schemas: ``curl "http://localhost:8080/api/admin/index/solr/schema"`` -You can use :download:`update-fields.sh <../../../../conf/solr/8.11.1/update-fields.sh>` to easily add these to the +You can use :download:`update-fields.sh <../../../../conf/solr/9.3.0/update-fields.sh>` to easily add these to the Solr schema you installed for your Dataverse installation. The script needs a target XML file containing your Solr schema. (See the :doc:`/installation/prerequisites/` section of @@ -540,7 +540,7 @@ from some place else than your Dataverse installation). Please note that reconfigurations of your Solr index might require a re-index. Usually release notes indicate a necessary re-index, but for your custom metadata you will need to keep track on your own. -Please note also that if you are going to make a pull request updating ``conf/solr/8.11.1/schema.xml`` with fields you have +Please note also that if you are going to make a pull request updating ``conf/solr/9.3.0/schema.xml`` with fields you have added, you should first load all the custom metadata blocks in ``scripts/api/data/metadatablocks`` (including ones you don't care about) to create a complete list of fields. (This might change in the future.) diff --git a/doc/sphinx-guides/source/developers/classic-dev-env.rst b/doc/sphinx-guides/source/developers/classic-dev-env.rst index 423f609dd2f..0dc3c5d75fc 100755 --- a/doc/sphinx-guides/source/developers/classic-dev-env.rst +++ b/doc/sphinx-guides/source/developers/classic-dev-env.rst @@ -134,7 +134,7 @@ On Linux, you should just install PostgreSQL using your favorite package manager Install Solr ^^^^^^^^^^^^ -`Solr `_ 8.11.1 is required. +`Solr `_ 9.3.0 is required. To install Solr, execute the following commands: @@ -144,25 +144,25 @@ To install Solr, execute the following commands: ``cd /usr/local/solr`` -``curl -O http://archive.apache.org/dist/lucene/solr/8.11.1/solr-8.11.1.tgz`` +``curl -O http://archive.apache.org/dist/lucene/solr/9.3.0/solr-9.3.0.tgz`` -``tar xvfz solr-8.11.1.tgz`` +``tar xvfz solr-9.3.0.tgz`` -``cd solr-8.11.1/server/solr`` +``cd solr-9.3.0/server/solr`` ``cp -r configsets/_default collection1`` -``curl -O https://raw.githubusercontent.com/IQSS/dataverse/develop/conf/solr/8.11.1/schema.xml`` +``curl -O https://raw.githubusercontent.com/IQSS/dataverse/develop/conf/solr/9.3.0/schema.xml`` -``curl -O https://raw.githubusercontent.com/IQSS/dataverse/develop/conf/solr/8.11.1/schema_dv_mdb_fields.xml`` +``curl -O https://raw.githubusercontent.com/IQSS/dataverse/develop/conf/solr/9.3.0/schema_dv_mdb_fields.xml`` ``mv schema*.xml collection1/conf`` -``curl -O https://raw.githubusercontent.com/IQSS/dataverse/develop/conf/solr/8.11.1/solrconfig.xml`` +``curl -O https://raw.githubusercontent.com/IQSS/dataverse/develop/conf/solr/9.3.0/solrconfig.xml`` ``mv solrconfig.xml collection1/conf/solrconfig.xml`` -``cd /usr/local/solr/solr-8.11.1`` +``cd /usr/local/solr/solr-9.3.0`` (Please note that the extra jetty argument below is a security measure to limit connections to Solr to only your computer. For extra security, run a firewall.) diff --git a/doc/sphinx-guides/source/installation/prerequisites.rst b/doc/sphinx-guides/source/installation/prerequisites.rst index b86bee9cd31..c06231b612e 100644 --- a/doc/sphinx-guides/source/installation/prerequisites.rst +++ b/doc/sphinx-guides/source/installation/prerequisites.rst @@ -159,7 +159,7 @@ The Dataverse Software search index is powered by Solr. Supported Versions ================== -The Dataverse Software has been tested with Solr version 8.11.1. Future releases in the 8.x series are likely to be compatible; however, this cannot be confirmed until they are officially tested. Major releases above 8.x (e.g. 9.x) are not supported. +The Dataverse Software has been tested with Solr version 9.3.0. Future releases in the 8.x series are likely to be compatible; however, this cannot be confirmed until they are officially tested. Major releases above 8.x (e.g. 9.x) are not supported. Installing Solr =============== @@ -174,19 +174,19 @@ Become the ``solr`` user and then download and configure Solr:: su - solr cd /usr/local/solr - wget https://archive.apache.org/dist/lucene/solr/8.11.1/solr-8.11.1.tgz - tar xvzf solr-8.11.1.tgz - cd solr-8.11.1 + wget https://archive.apache.org/dist/lucene/solr/9.3.0/solr-9.3.0.tgz + tar xvzf solr-9.3.0.tgz + cd solr-9.3.0 cp -r server/solr/configsets/_default server/solr/collection1 You should already have a "dvinstall.zip" file that you downloaded from https://github.com/IQSS/dataverse/releases . Unzip it into ``/tmp``. Then copy the files into place:: - cp /tmp/dvinstall/schema*.xml /usr/local/solr/solr-8.11.1/server/solr/collection1/conf - cp /tmp/dvinstall/solrconfig.xml /usr/local/solr/solr-8.11.1/server/solr/collection1/conf + cp /tmp/dvinstall/schema*.xml /usr/local/solr/solr-9.3.0/server/solr/collection1/conf + cp /tmp/dvinstall/solrconfig.xml /usr/local/solr/solr-9.3.0/server/solr/collection1/conf Note: The Dataverse Project team has customized Solr to boost results that come from certain indexed elements inside the Dataverse installation, for example prioritizing results from Dataverse collections over Datasets. If you would like to remove this, edit your ``solrconfig.xml`` and remove the ```` element and its contents. If you have ideas about how this boosting could be improved, feel free to contact us through our Google Group https://groups.google.com/forum/#!forum/dataverse-dev . -A Dataverse installation requires a change to the ``jetty.xml`` file that ships with Solr. Edit ``/usr/local/solr/solr-8.11.1/server/etc/jetty.xml`` , increasing ``requestHeaderSize`` from ``8192`` to ``102400`` +A Dataverse installation requires a change to the ``jetty.xml`` file that ships with Solr. Edit ``/usr/local/solr/solr-9.3.0/server/etc/jetty.xml`` , increasing ``requestHeaderSize`` from ``8192`` to ``102400`` Solr will warn about needing to increase the number of file descriptors and max processes in a production environment but will still run with defaults. We have increased these values to the recommended levels by adding ulimit -n 65000 to the init script, and the following to ``/etc/security/limits.conf``:: @@ -205,7 +205,7 @@ Solr launches asynchronously and attempts to use the ``lsof`` binary to watch fo Finally, you need to tell Solr to create the core "collection1" on startup:: - echo "name=collection1" > /usr/local/solr/solr-8.11.1/server/solr/collection1/core.properties + echo "name=collection1" > /usr/local/solr/solr-9.3.0/server/solr/collection1/core.properties Solr Init Script ================ diff --git a/downloads/download.sh b/downloads/download.sh index 7ccff358820..7f53cef1a93 100755 --- a/downloads/download.sh +++ b/downloads/download.sh @@ -1,5 +1,5 @@ #!/bin/sh curl -L -O https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/6.2023.7/payara-6.2023.7.zip -curl -L -O https://archive.apache.org/dist/lucene/solr/8.11.1/solr-8.11.1.tgz +curl -L -O https://archive.apache.org/dist/solr/solr/9.3.0/solr-9.3.0.tgz curl -L -O https://search.maven.org/remotecontent?filepath=org/jboss/weld/weld-osgi-bundle/2.2.10.Final/weld-osgi-bundle-2.2.10.Final-glassfish4.jar curl -s -L http://sourceforge.net/projects/schemaspy/files/schemaspy/SchemaSpy%205.0.0/schemaSpy_5.0.0.jar/download > schemaSpy_5.0.0.jar diff --git a/modules/container-configbaker/assembly.xml b/modules/container-configbaker/assembly.xml index f5b309175ed..3285eef510a 100644 --- a/modules/container-configbaker/assembly.xml +++ b/modules/container-configbaker/assembly.xml @@ -8,7 +8,7 @@ - conf/solr/8.11.1 + conf/solr/9.3.0 solr @@ -43,4 +43,4 @@ - \ No newline at end of file + diff --git a/modules/dataverse-parent/pom.xml b/modules/dataverse-parent/pom.xml index 7c83ac39736..c9ed98bca9e 100644 --- a/modules/dataverse-parent/pom.xml +++ b/modules/dataverse-parent/pom.xml @@ -150,7 +150,7 @@ 6.2023.7 42.5.1 - 8.11.1 + 9.3.0 1.12.290 0.177.0 diff --git a/scripts/installer/Makefile b/scripts/installer/Makefile index a1fbfab782e..399bc65168a 100644 --- a/scripts/installer/Makefile +++ b/scripts/installer/Makefile @@ -55,13 +55,13 @@ ${JHOVE_SCHEMA}: ../../conf/jhove/jhoveConfig.xsd ${INSTALLER_ZIP_DIR} @echo copying jhove schema file /bin/cp ../../conf/jhove/jhoveConfig.xsd ${INSTALLER_ZIP_DIR} -${SOLR_SCHEMA}: ../../conf/solr/8.11.1/schema.xml ../../conf/solr/8.11.1/update-fields.sh ${INSTALLER_ZIP_DIR} +${SOLR_SCHEMA}: ../../conf/solr/9.3.0/schema.xml ../../conf/solr/9.3.0/update-fields.sh ${INSTALLER_ZIP_DIR} @echo copying Solr schema file - /bin/cp ../../conf/solr/8.11.1/schema.xml ../../conf/solr/8.11.1/update-fields.sh ${INSTALLER_ZIP_DIR} + /bin/cp ../../conf/solr/9.3.0/schema.xml ../../conf/solr/9.3.0/update-fields.sh ${INSTALLER_ZIP_DIR} -${SOLR_CONFIG}: ../../conf/solr/8.11.1/solrconfig.xml ${INSTALLER_ZIP_DIR} +${SOLR_CONFIG}: ../../conf/solr/9.3.0/solrconfig.xml ${INSTALLER_ZIP_DIR} @echo copying Solr config file - /bin/cp ../../conf/solr/8.11.1/solrconfig.xml ${INSTALLER_ZIP_DIR} + /bin/cp ../../conf/solr/9.3.0/solrconfig.xml ${INSTALLER_ZIP_DIR} ${PYTHON_FILES}: README_python.txt install.py installConfig.py installAppServer.py installUtils.py requirements.txt default.config interactive.config ${INSTALLER_ZIP_DIR} @echo copying Python installer files diff --git a/scripts/vagrant/setup-solr.sh b/scripts/vagrant/setup-solr.sh index 70d3fc632a7..749ec46364a 100755 --- a/scripts/vagrant/setup-solr.sh +++ b/scripts/vagrant/setup-solr.sh @@ -5,12 +5,12 @@ SOLR_USER=solr SOLR_HOME=/usr/local/solr mkdir $SOLR_HOME chown $SOLR_USER:$SOLR_USER $SOLR_HOME -su $SOLR_USER -s /bin/sh -c "cp /dataverse/downloads/solr-8.11.1.tgz $SOLR_HOME" -su $SOLR_USER -s /bin/sh -c "cd $SOLR_HOME && tar xfz solr-8.11.1.tgz" -su $SOLR_USER -s /bin/sh -c "cd $SOLR_HOME/solr-8.11.1/server/solr && cp -r configsets/_default . && mv _default collection1" -su $SOLR_USER -s /bin/sh -c "cp /dataverse/conf/solr/8.11.1/schema*.xml $SOLR_HOME/solr-8.11.1/server/solr/collection1/conf/" -su $SOLR_USER -s /bin/sh -c "cp /dataverse/conf/solr/8.11.1/solrconfig.xml $SOLR_HOME/solr-8.11.1/server/solr/collection1/conf/solrconfig.xml" -su $SOLR_USER -s /bin/sh -c "cd $SOLR_HOME/solr-8.11.1 && bin/solr start && bin/solr create_core -c collection1 -d server/solr/collection1/conf/" +su $SOLR_USER -s /bin/sh -c "cp /dataverse/downloads/solr-9.3.0.tgz $SOLR_HOME" +su $SOLR_USER -s /bin/sh -c "cd $SOLR_HOME && tar xfz solr-9.3.0.tgz" +su $SOLR_USER -s /bin/sh -c "cd $SOLR_HOME/solr-9.3.0/server/solr && cp -r configsets/_default . && mv _default collection1" +su $SOLR_USER -s /bin/sh -c "cp /dataverse/conf/solr/9.3.0/schema*.xml $SOLR_HOME/solr-9.3.0/server/solr/collection1/conf/" +su $SOLR_USER -s /bin/sh -c "cp /dataverse/conf/solr/9.3.0/solrconfig.xml $SOLR_HOME/solr-9.3.0/server/solr/collection1/conf/solrconfig.xml" +su $SOLR_USER -s /bin/sh -c "cd $SOLR_HOME/solr-9.3.0 && bin/solr start && bin/solr create_core -c collection1 -d server/solr/collection1/conf/" cp /dataverse/doc/sphinx-guides/source/_static/installation/files/etc/init.d/solr /etc/init.d/solr chmod 755 /etc/init.d/solr /etc/init.d/solr stop diff --git a/scripts/vagrant/setup.sh b/scripts/vagrant/setup.sh index b446e2dd5dc..0ab3e482140 100644 --- a/scripts/vagrant/setup.sh +++ b/scripts/vagrant/setup.sh @@ -52,7 +52,7 @@ echo "Ensuring Unix user '$SOLR_USER' exists" useradd $SOLR_USER || : DOWNLOAD_DIR='/dataverse/downloads' PAYARA_ZIP="$DOWNLOAD_DIR/payara-6.2023.7.zip" -SOLR_TGZ="$DOWNLOAD_DIR/solr-8.11.1.tgz" +SOLR_TGZ="$DOWNLOAD_DIR/solr-9.3.0.tgz" if [ ! -f $PAYARA_ZIP ] || [ ! -f $SOLR_TGZ ]; then echo "Couldn't find $PAYARA_ZIP or $SOLR_TGZ! Running download script...." cd $DOWNLOAD_DIR && ./download.sh && cd diff --git a/tests/shell/spec/update_fields_spec.sh b/tests/shell/spec/update_fields_spec.sh index e77121672dd..48054a121b7 100644 --- a/tests/shell/spec/update_fields_spec.sh +++ b/tests/shell/spec/update_fields_spec.sh @@ -1,16 +1,16 @@ #shellcheck shell=sh update_fields() { - ../../conf/solr/8.11.1/update-fields.sh "$@" + ../../conf/solr/9.3.0/update-fields.sh "$@" } Describe "Update fields command" Describe "can operate on upstream data" - copyUpstreamSchema() { cp ../../conf/solr/8.11.1/schema.xml data/solr/upstream-schema.xml; } + copyUpstreamSchema() { cp ../../conf/solr/9.3.0/schema.xml data/solr/upstream-schema.xml; } AfterAll 'copyUpstreamSchema' - Path schema-xml="../../conf/solr/8.11.1/schema.xml" + Path schema-xml="../../conf/solr/9.3.0/schema.xml" It "needs upstream schema.xml" The path schema-xml should be exist End From 88efc55c710d5e085ec60e3fbadb6d25a2d65e54 Mon Sep 17 00:00:00 2001 From: Don Sizemore Date: Tue, 15 Aug 2023 14:21:35 -0400 Subject: [PATCH 068/173] #9340 revise upgrade instructions --- doc/release-notes/9340-payara5to6.md | 42 ++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/doc/release-notes/9340-payara5to6.md b/doc/release-notes/9340-payara5to6.md index 360834217ef..79947545303 100644 --- a/doc/release-notes/9340-payara5to6.md +++ b/doc/release-notes/9340-payara5to6.md @@ -4,25 +4,25 @@ `curl -L -O https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/6.2023.7/payara-6.2023.7.zip` -1. Unzip it to /usr/local (or your preferred location) +1. Unzip it to /usr/local (or your preferred location): `sudo unzip payara-6.2023.7.zip -d /usr/local/` -1. Change ownership of the unzipped Payara to your "service" user ("dataverse" by default) +1. Change ownership of the unzipped Payara to your "service" user ("dataverse" by default): `sudo chown -R dataverse /usr/local/payara6` -1. Undeploy Dataverse (if deployed; version 5.14 is assumed in the example below) +1. Undeploy Dataverse (if deployed, using the unprivileged service account. Version 5.14 is assumed in the example below): - `sudo /usr/local/payara5/bin/asadmin list-applications` + `sudo -u dataverse /usr/local/payara5/bin/asadmin list-applications` - `sudo /usr/local/payara5/bin/asadmin undeploy dataverse-5.14` + `sudo -u dataverse /usr/local/payara5/bin/asadmin undeploy dataverse-5.14` -1. Stop Payara 5 +1. Stop Payara 5: `sudo /usr/local/payara5/bin/asadmin stop-domain` -1. Copy Dataverse-related lines from Payara 5 to Payara 6 domain.xml +1. Copy Dataverse-related lines from Payara 5 to Payara 6 domain.xml: `sudo cp /usr/local/payara6/glassfish/domains/domain1/config/domain.xml /usr/local/payara6/glassfish/domains/domain1/config/domain.xml.orig` @@ -48,6 +48,8 @@ ``` + Note: if you used the Dataverse installer, you won't have a `dataverse.db.password` property. See "Create Password Aliases" below. + Section 3: JVM options (under ``) ``` @@ -70,18 +72,31 @@ -Ddoi.dataciterestapiurlstring=https://api.test.datacite.org ``` -1. Copy jhove.conf from Payara 5, edit and change payara5 to payara6 +1. Copy jhove.conf and jhoveConfig.xsd from Payara 5, edit and change payara5 to payara6 - `sudo cp /usr/local/payara5/glassfish/domains/domain1/config/jhove.conf /usr/local/payara6/glassfish/domains/domain1/config/jhove.conf` + `sudo cp /usr/local/payara5/glassfish/domains/domain1/config/jhove* /usr/local/payara6/glassfish/domains/domain1/config/` - `sudo chown dataverse /usr/local/payara6/glassfish/domains/domain1/config/jhove.conf` + `sudo chown dataverse /usr/local/payara6/glassfish/domains/domain1/config/jhove*` `sudo -u dataverse vi /usr/local/payara6/glassfish/domains/domain1/config/jhove.conf` +1. Update systemd unit file (or other init system) to from `/usr/local/payara5` to `/usr/local/payara6`, if applicable. + 1. Start Payara: `sudo -u dataverse /usr/local/payara6/bin/asadmin start-domain` +1. If you're using password aliases for your database, rserve and datacite jvm-options, recreate them here: + + ``` + $ echo "AS_ADMIN_ALIASPASSWORD=yourDBpassword" > /tmp/dataverse.db.password.txt + $ sudo -u dataverse /usr/local/payara6/bin/asadmin create-password-alias --passwordfile /tmp/dataverse.db.password.txt + Enter the value for the aliasname operand> dataverse.db.password + Command create-password-alias executed successfully. + ``` + + You'll want to perform simalar commands for `rserve_password_alias` and `doi_password_alias` if you're using Rserve and/or Datacite. + 1. Deploy the Dataverse 6.0 warfile: `sudo -u dataverse /usr/local/payara6/bin/asadmin deploy /path/to/dataverse-6.0.war` @@ -92,4 +107,9 @@ 1. Create the network listener on port 8009 - `sudo -u dataverse /usr/local/payara6/bin/asadmin create-network-listener --protocol http-listener-1 --listenerport 8009 --jkenabled true jk-connector` \ No newline at end of file + `sudo -u dataverse /usr/local/payara6/bin/asadmin create-network-listener --protocol http-listener-1 --listenerport 8009 --jkenabled true jk-connector` + +1. Perform one final Payara restart to ensure that timers are initialized properly. This example stops Payara manually, then starts Payara using systemd: + + `sudo -u dataverse /usr/local/payara6/bin/asadmin stop-domain` + `sudo systemctl start payara` \ No newline at end of file From 196c72023f4c3ad680a53886914a9b0d308856a1 Mon Sep 17 00:00:00 2001 From: Don Sizemore Date: Tue, 15 Aug 2023 15:12:58 -0400 Subject: [PATCH 069/173] #9340 respond to Phil's suggested edits --- doc/release-notes/9340-payara5to6.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/doc/release-notes/9340-payara5to6.md b/doc/release-notes/9340-payara5to6.md index 79947545303..ce41973c874 100644 --- a/doc/release-notes/9340-payara5to6.md +++ b/doc/release-notes/9340-payara5to6.md @@ -48,7 +48,7 @@ ``` - Note: if you used the Dataverse installer, you won't have a `dataverse.db.password` property. See "Create Password Aliases" below. + Note: if you used the Dataverse installer, you won't have a `dataverse.db.password` property. See "Create password aliases" below. Section 3: JVM options (under ``) @@ -72,6 +72,8 @@ -Ddoi.dataciterestapiurlstring=https://api.test.datacite.org ``` +1. Check the `Xmx` setting in `/usr/local/payara6/glassfish/domains/domain1/config/domain.xml`. Note that there are two such settings, and you want to adjust the one in the stanza with Dataverse options. This sets the JVM heap size; a good rule of thumb is half of your system's total RAM. You may specify the value in MB (`4096m`) or GB (`4g`). + 1. Copy jhove.conf and jhoveConfig.xsd from Payara 5, edit and change payara5 to payara6 `sudo cp /usr/local/payara5/glassfish/domains/domain1/config/jhove* /usr/local/payara6/glassfish/domains/domain1/config/` @@ -80,13 +82,13 @@ `sudo -u dataverse vi /usr/local/payara6/glassfish/domains/domain1/config/jhove.conf` -1. Update systemd unit file (or other init system) to from `/usr/local/payara5` to `/usr/local/payara6`, if applicable. +1. Update systemd unit file (or other init system) from `/usr/local/payara5` to `/usr/local/payara6`, if applicable. 1. Start Payara: `sudo -u dataverse /usr/local/payara6/bin/asadmin start-domain` -1. If you're using password aliases for your database, rserve and datacite jvm-options, recreate them here: +1. Create password aliases for your database, rserve and datacite jvm-options, if you're using them: ``` $ echo "AS_ADMIN_ALIASPASSWORD=yourDBpassword" > /tmp/dataverse.db.password.txt @@ -95,7 +97,7 @@ Command create-password-alias executed successfully. ``` - You'll want to perform simalar commands for `rserve_password_alias` and `doi_password_alias` if you're using Rserve and/or Datacite. + You'll want to perform similar commands for `rserve_password_alias` and `doi_password_alias` if you're using Rserve and/or Datacite. 1. Deploy the Dataverse 6.0 warfile: @@ -109,7 +111,7 @@ `sudo -u dataverse /usr/local/payara6/bin/asadmin create-network-listener --protocol http-listener-1 --listenerport 8009 --jkenabled true jk-connector` -1. Perform one final Payara restart to ensure that timers are initialized properly. This example stops Payara manually, then starts Payara using systemd: +1. Perform one final Payara restart to ensure that timers are initialized properly: `sudo -u dataverse /usr/local/payara6/bin/asadmin stop-domain` - `sudo systemctl start payara` \ No newline at end of file + `sudo -u dataverse /usr/local/payara6/bin/asadmin start-domain` \ No newline at end of file From 5a68632c4dd6ed07c60682be03c6e90c439bcc32 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Wed, 16 Aug 2023 09:39:56 -0400 Subject: [PATCH 070/173] replace vanilla Solr 9.3.0 config with our 8.11.1 #9260 --- conf/solr/8.11.1/schema.xml | 1559 ------------------- conf/solr/8.11.1/solrconfig.xml | 1410 ----------------- conf/solr/9.3.0/schema.xml | 1424 +++++++++++------ conf/solr/9.3.0/solrconfig.xml | 2531 +++++++++++++++++-------------- 4 files changed, 2385 insertions(+), 4539 deletions(-) delete mode 100644 conf/solr/8.11.1/schema.xml delete mode 100644 conf/solr/8.11.1/solrconfig.xml diff --git a/conf/solr/8.11.1/schema.xml b/conf/solr/8.11.1/schema.xml deleted file mode 100644 index ceff082f418..00000000000 --- a/conf/solr/8.11.1/schema.xml +++ /dev/null @@ -1,1559 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - id - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/conf/solr/8.11.1/solrconfig.xml b/conf/solr/8.11.1/solrconfig.xml deleted file mode 100644 index 3e4e5adc7b6..00000000000 --- a/conf/solr/8.11.1/solrconfig.xml +++ /dev/null @@ -1,1410 +0,0 @@ - - - - - - - - - 7.3.0 - - - - - - - - - - - - - - - - - - - - ${solr.data.dir:} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ${solr.lock.type:native} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ${solr.ulog.dir:} - ${solr.ulog.numVersionBuckets:65536} - - - - - ${solr.autoCommit.maxTime:15000} - false - - - - - - ${solr.autoSoftCommit.maxTime:-1} - - - - - - - - - - - - - - 1024 - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - 20 - - - 200 - - - - - - - - - - - - - - - - false - - - - - - - - - - - - - - - - - - - - - - explicit - 10 - edismax - 0.075 - - dvName^400 - authorName^180 - dvSubject^190 - dvDescription^180 - dvAffiliation^170 - title^130 - subject^120 - keyword^110 - topicClassValue^100 - dsDescriptionValue^90 - authorAffiliation^80 - publicationCitation^60 - producerName^50 - fileName^30 - fileDescription^30 - variableLabel^20 - variableName^10 - _text_^1.0 - - - dvName^200 - authorName^100 - dvSubject^100 - dvDescription^100 - dvAffiliation^100 - title^75 - subject^75 - keyword^75 - topicClassValue^75 - dsDescriptionValue^75 - authorAffiliation^75 - publicationCitation^75 - producerName^75 - - - - isHarvested:false^25000 - - - - - - - - - - - - - - - - - - explicit - json - true - - - - - - - - explicit - - - - - - _text_ - - - - - - - true - ignored_ - _text_ - - - - - - - - - text_general - - - - - - default - _text_ - solr.DirectSolrSpellChecker - - internal - - 0.5 - - 2 - - 1 - - 5 - - 4 - - 0.01 - - - - - - - - - - - - default - on - true - 10 - 5 - 5 - true - true - 10 - 5 - - - spellcheck - - - - - - - - - - true - - - tvComponent - - - - - - - - - - - - true - false - - - terms - - - - - - - - string - - - - - - explicit - - - elevator - - - - - - - - - - - 100 - - - - - - - - 70 - - 0.5 - - [-\w ,/\n\"']{20,200} - - - - - - - ]]> - ]]> - - - - - - - - - - - - - - - - - - - - - - - - ,, - ,, - ,, - ,, - ,]]> - ]]> - - - - - - 10 - .,!? - - - - - - - WORD - - - en - US - - - - - - - - - - - - - - [^\w-\.] - _ - - - - - - - yyyy-MM-dd'T'HH:mm:ss.SSSZ - yyyy-MM-dd'T'HH:mm:ss,SSSZ - yyyy-MM-dd'T'HH:mm:ss.SSS - yyyy-MM-dd'T'HH:mm:ss,SSS - yyyy-MM-dd'T'HH:mm:ssZ - yyyy-MM-dd'T'HH:mm:ss - yyyy-MM-dd'T'HH:mmZ - yyyy-MM-dd'T'HH:mm - yyyy-MM-dd HH:mm:ss.SSSZ - yyyy-MM-dd HH:mm:ss,SSSZ - yyyy-MM-dd HH:mm:ss.SSS - yyyy-MM-dd HH:mm:ss,SSS - yyyy-MM-dd HH:mm:ssZ - yyyy-MM-dd HH:mm:ss - yyyy-MM-dd HH:mmZ - yyyy-MM-dd HH:mm - yyyy-MM-dd - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/plain; charset=UTF-8 - - - - - ${velocity.template.base.dir:} - ${velocity.solr.resource.loader.enabled:true} - ${velocity.params.resource.loader.enabled:false} - - - - - 5 - - - - - - - - - - - - - - diff --git a/conf/solr/9.3.0/schema.xml b/conf/solr/9.3.0/schema.xml index 47319dc96ef..ceff082f418 100644 --- a/conf/solr/9.3.0/schema.xml +++ b/conf/solr/9.3.0/schema.xml @@ -23,7 +23,7 @@ For more information, on how to customize this file, please see - https://solr.apache.org/guide/solr/latest/indexing-guide/schema-elements.html + http://lucene.apache.org/solr/guide/documents-fields-and-schema-design.html PERFORMANCE NOTE: this schema includes many optional features and should not be used for benchmarking. To improve performance one could @@ -38,36 +38,36 @@ catchall "text" field, and use that for searching. --> - + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - + RESTRICTION: the glob-like pattern in the name attribute must have a "*" only at the start or the end. --> + + + + + + + - - - + + + + + + - + + + - + @@ -200,6 +724,76 @@ field first in an ascending sort and last in a descending sort. --> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -216,20 +810,15 @@ - + - - - - - + - - - + removes stop words from case-insensitive "stopwords.txt" + (empty by default), and down cases. At query time only, it + also applies synonyms. + --> - - + + - + - - - - - - - - - - - - - - - - - - - - - - + + + + @@ -342,41 +899,51 @@ finally applies Porter's stemming. The query time analyzer also applies synonyms from synonyms.txt. --> - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + - - - + + - - - - + + + + @@ -426,57 +994,57 @@ - - - - - - - + + + + + + + - - + + - - - - - - - + + + + + + + - + - - - - + + + - - - - + + + + - - + + @@ -484,22 +1052,22 @@ - - + + - - + - + @@ -510,16 +1078,16 @@ - + - + + + - - + + - - + + - - + + @@ -566,268 +1137,257 @@ - - + + - - + + - - + + - - - - - + + + + + - + - - + + - - - - + + + + - + - + - + - - + + - - - - - + + + + + - + - - - - - + + + + + - + - - - - - - - - + + + + + + + + - + - - + + - - - + + + - + - - - - - - + + + + + + - - - - - - - - - - - - + - - - - - + + + + + - + - - - - - - + + + + + + - + - - - - - - + + + + + + - + - - + + - - - - - - + + + + + + - + - - + + - + - - - - + + + + - + - - - - - - + + + + + + - + - - - + + + - + - - - + + + - + - - - - - - + + + + + + - + - - - - - + + + + + - + - - - - + + + + - + - + - - + + - - - - - + + + + + - + - - + + - + - + - + - + - + - - - - - - - - - - - - - - - + - + - - - - - + + + + + - + - - - - - - + + + + + + - + - - - - - - - + + + + + + + - + - - - - - - - - + + + + + + + + - + - - - - - + + + + + - + - - - - - - + + + + + + - + - - - - - - + + + + + + - + - - - + + + - + - - - - - + + + + + - - - - - - - 9.7 - - - - - - - - - - - ${solr.data.dir:} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ${solr.lock.type:native} - - - - - - - - - - - - - - - - - - - - - ${solr.ulog.dir:} - ${solr.ulog.numVersionBuckets:65536} - - - - - ${solr.autoCommit.maxTime:15000} - false - - - - - - ${solr.autoSoftCommit.maxTime:-1} - - - - - - - - - - - - - - ${solr.max.booleanClauses:1024} - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - 20 - - - 200 - - - - - - - - - - - - - - - - - - - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - explicit - 10 - - - - - - - explicit - json - true - - - - - - - _text_ - - - - - - - text_general - - - - - - default - _text_ - solr.DirectSolrSpellChecker - - internal - - 0.5 - - 2 - - 1 - - 5 - - 4 - - 0.01 - - - - - - - - - - - - default - on - true - 10 - 5 - 5 - true - true - 10 - 5 - - - spellcheck - - - - - - - - - - - - 100 - - - - - - - - 70 - - 0.5 - - [-\w ,/\n\"']{20,200} - - - - - - - ]]> - ]]> - - - - - - - - - - - - - - - - - - - - - - - - ,, - ,, - ,, - ,, - ,]]> - ]]> - - - - - - 10 - .,!? - - - - - - - WORD - - - en - US - - - - - - - - - - - - [^\w-\.] - _ - - - - - - - yyyy-MM-dd['T'[HH:mm[:ss[.SSS]][z - yyyy-MM-dd['T'[HH:mm[:ss[,SSS]][z - yyyy-MM-dd HH:mm[:ss[.SSS]][z - yyyy-MM-dd HH:mm[:ss[,SSS]][z - [EEE, ]dd MMM yyyy HH:mm[:ss] z - EEEE, dd-MMM-yy HH:mm:ss z - EEE MMM ppd HH:mm:ss [z ]yyyy - - - - - java.lang.String - text_general - - *_str - 256 - - - true - - - java.lang.Boolean - booleans - - - java.util.Date - pdates - - - java.lang.Long - java.lang.Integer - plongs - - - java.lang.Number - pdoubles - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + 7.3.0 + + + + + + + + + + + + + + + + + + + + ${solr.data.dir:} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${solr.lock.type:native} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${solr.ulog.dir:} + ${solr.ulog.numVersionBuckets:65536} + + + + + ${solr.autoCommit.maxTime:15000} + false + + + + + + ${solr.autoSoftCommit.maxTime:-1} + + + + + + + + + + + + + + 1024 + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + 20 + + + 200 + + + + + + + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + + + + explicit + 10 + edismax + 0.075 + + dvName^400 + authorName^180 + dvSubject^190 + dvDescription^180 + dvAffiliation^170 + title^130 + subject^120 + keyword^110 + topicClassValue^100 + dsDescriptionValue^90 + authorAffiliation^80 + publicationCitation^60 + producerName^50 + fileName^30 + fileDescription^30 + variableLabel^20 + variableName^10 + _text_^1.0 + + + dvName^200 + authorName^100 + dvSubject^100 + dvDescription^100 + dvAffiliation^100 + title^75 + subject^75 + keyword^75 + topicClassValue^75 + dsDescriptionValue^75 + authorAffiliation^75 + publicationCitation^75 + producerName^75 + + + + isHarvested:false^25000 + + + + + + + + + + + + + + + + + + explicit + json + true + + + + + + + + explicit + + + + + + _text_ + + + + + + + true + ignored_ + _text_ + + + + + + + + + text_general + + + + + + default + _text_ + solr.DirectSolrSpellChecker + + internal + + 0.5 + + 2 + + 1 + + 5 + + 4 + + 0.01 + + + + + + + + + + + + default + on + true + 10 + 5 + 5 + true + true + 10 + 5 + + + spellcheck + + + + + + + + + + true + + + tvComponent + + + + + + + + + + + + true + false + + + terms + + + + + + + + string + + + + + + explicit + + + elevator + + + + + + + + + + + 100 + + + + + + + + 70 + + 0.5 + + [-\w ,/\n\"']{20,200} + + + + + + + ]]> + ]]> + + + + + + + + + + + + + + + + + + + + + + + + ,, + ,, + ,, + ,, + ,]]> + ]]> + + + + + + 10 + .,!? + + + + + + + WORD + + + en + US + + + + + + + + + + + + + + [^\w-\.] + _ + + + + + + + yyyy-MM-dd'T'HH:mm:ss.SSSZ + yyyy-MM-dd'T'HH:mm:ss,SSSZ + yyyy-MM-dd'T'HH:mm:ss.SSS + yyyy-MM-dd'T'HH:mm:ss,SSS + yyyy-MM-dd'T'HH:mm:ssZ + yyyy-MM-dd'T'HH:mm:ss + yyyy-MM-dd'T'HH:mmZ + yyyy-MM-dd'T'HH:mm + yyyy-MM-dd HH:mm:ss.SSSZ + yyyy-MM-dd HH:mm:ss,SSSZ + yyyy-MM-dd HH:mm:ss.SSS + yyyy-MM-dd HH:mm:ss,SSS + yyyy-MM-dd HH:mm:ssZ + yyyy-MM-dd HH:mm:ss + yyyy-MM-dd HH:mmZ + yyyy-MM-dd HH:mm + yyyy-MM-dd + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/plain; charset=UTF-8 + + + + + ${velocity.template.base.dir:} + ${velocity.solr.resource.loader.enabled:true} + ${velocity.params.resource.loader.enabled:false} + + + + + 5 + + + + + + + + + + + + + + From 10cb29440f52a19d745e9bae300580d7b6bf6402 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Wed, 16 Aug 2023 10:52:57 -0400 Subject: [PATCH 071/173] fix XSLTResponseWriter namespace and enable scripting module #9260 "To improve security, XSLTResponseWriter has been moved to the scripting Module instead of shipping as part of Solr core. This module needs to be enabled explicitly." -- https://github.com/apache/solr/blob/main/solr/solr-ref-guide/modules/upgrade-notes/pages/major-changes-in-solr-9.adoc See also https://stackoverflow.com/questions/74118537/solr-9-org-apache-solr-common-solrexceptionorg-apache-solr-common-solrexcepti --- conf/solr/9.3.0/solrconfig.xml | 2 +- .../source/_static/installation/files/etc/init.d/solr | 2 +- .../source/_static/installation/files/etc/systemd/solr.service | 2 +- doc/sphinx-guides/source/developers/classic-dev-env.rst | 2 +- doc/sphinx-guides/source/installation/prerequisites.rst | 2 ++ docker-compose-dev.yml | 2 ++ scripts/vagrant/setup-solr.sh | 2 +- 7 files changed, 9 insertions(+), 5 deletions(-) diff --git a/conf/solr/9.3.0/solrconfig.xml b/conf/solr/9.3.0/solrconfig.xml index 3e4e5adc7b6..73535b5011c 100644 --- a/conf/solr/9.3.0/solrconfig.xml +++ b/conf/solr/9.3.0/solrconfig.xml @@ -1353,7 +1353,7 @@ in Solr's conf/xslt directory. Changes to xslt files are checked for every xsltCacheLifetimeSeconds. --> - + 5 diff --git a/doc/sphinx-guides/source/_static/installation/files/etc/init.d/solr b/doc/sphinx-guides/source/_static/installation/files/etc/init.d/solr index 9cf8902eb14..2ead38cf0e9 100755 --- a/doc/sphinx-guides/source/_static/installation/files/etc/init.d/solr +++ b/doc/sphinx-guides/source/_static/installation/files/etc/init.d/solr @@ -7,7 +7,7 @@ SOLR_DIR="/usr/local/solr/solr-9.3.0" SOLR_COMMAND="bin/solr" -SOLR_ARGS="-m 1g -j jetty.host=127.0.0.1" +SOLR_ARGS="-m 1g -j jetty.host=127.0.0.1 -Dsolr.modules=scripting" SOLR_USER=solr case $1 in diff --git a/doc/sphinx-guides/source/_static/installation/files/etc/systemd/solr.service b/doc/sphinx-guides/source/_static/installation/files/etc/systemd/solr.service index 0b8a8528490..b74d6898418 100644 --- a/doc/sphinx-guides/source/_static/installation/files/etc/systemd/solr.service +++ b/doc/sphinx-guides/source/_static/installation/files/etc/systemd/solr.service @@ -6,7 +6,7 @@ After = syslog.target network.target remote-fs.target nss-lookup.target User = solr Type = forking WorkingDirectory = /usr/local/solr/solr-9.3.0 -ExecStart = /usr/local/solr/solr-9.3.0/bin/solr start -m 1g -j "jetty.host=127.0.0.1" +ExecStart = /usr/local/solr/solr-9.3.0/bin/solr start -m 1g -j "jetty.host=127.0.0.1" -Dsolr.modules=scripting ExecStop = /usr/local/solr/solr-9.3.0/bin/solr stop LimitNOFILE=65000 LimitNPROC=65000 diff --git a/doc/sphinx-guides/source/developers/classic-dev-env.rst b/doc/sphinx-guides/source/developers/classic-dev-env.rst index 0dc3c5d75fc..98cb07a09e2 100755 --- a/doc/sphinx-guides/source/developers/classic-dev-env.rst +++ b/doc/sphinx-guides/source/developers/classic-dev-env.rst @@ -166,7 +166,7 @@ To install Solr, execute the following commands: (Please note that the extra jetty argument below is a security measure to limit connections to Solr to only your computer. For extra security, run a firewall.) -``bin/solr start -j "-Djetty.host=127.0.0.1"`` +``bin/solr start -j "-Djetty.host=127.0.0.1 -Dsolr.modules=scripting"`` ``bin/solr create_core -c collection1 -d server/solr/collection1/conf`` diff --git a/doc/sphinx-guides/source/installation/prerequisites.rst b/doc/sphinx-guides/source/installation/prerequisites.rst index c06231b612e..3421fd46a2f 100644 --- a/doc/sphinx-guides/source/installation/prerequisites.rst +++ b/doc/sphinx-guides/source/installation/prerequisites.rst @@ -226,6 +226,8 @@ For systems using init.d (like CentOS 6), download this :download:`Solr init scr service start solr chkconfig solr on +Please note that as of Solr 9 the following argument `to enable a module `_ has been added to the init scripts: ``-Dsolr.modules=scripting`` + Securing Solr ============= diff --git a/docker-compose-dev.yml b/docker-compose-dev.yml index ab44dbc1806..462824f9db9 100644 --- a/docker-compose-dev.yml +++ b/docker-compose-dev.yml @@ -78,6 +78,8 @@ services: depends_on: - dev_solr_initializer restart: on-failure + environment: + - SOLR_MODULES=scripting ports: - "8983:8983" networks: diff --git a/scripts/vagrant/setup-solr.sh b/scripts/vagrant/setup-solr.sh index 749ec46364a..2b7e136538c 100755 --- a/scripts/vagrant/setup-solr.sh +++ b/scripts/vagrant/setup-solr.sh @@ -10,7 +10,7 @@ su $SOLR_USER -s /bin/sh -c "cd $SOLR_HOME && tar xfz solr-9.3.0.tgz" su $SOLR_USER -s /bin/sh -c "cd $SOLR_HOME/solr-9.3.0/server/solr && cp -r configsets/_default . && mv _default collection1" su $SOLR_USER -s /bin/sh -c "cp /dataverse/conf/solr/9.3.0/schema*.xml $SOLR_HOME/solr-9.3.0/server/solr/collection1/conf/" su $SOLR_USER -s /bin/sh -c "cp /dataverse/conf/solr/9.3.0/solrconfig.xml $SOLR_HOME/solr-9.3.0/server/solr/collection1/conf/solrconfig.xml" -su $SOLR_USER -s /bin/sh -c "cd $SOLR_HOME/solr-9.3.0 && bin/solr start && bin/solr create_core -c collection1 -d server/solr/collection1/conf/" +su $SOLR_USER -s /bin/sh -c "cd $SOLR_HOME/solr-9.3.0 && bin/solr start -Dsolr.modules=scripting && bin/solr create_core -c collection1 -d server/solr/collection1/conf/" cp /dataverse/doc/sphinx-guides/source/_static/installation/files/etc/init.d/solr /etc/init.d/solr chmod 755 /etc/init.d/solr /etc/init.d/solr stop From bb01c6ed11fe43cb9d5622b1b0041570e30b1cb9 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Wed, 16 Aug 2023 10:57:38 -0400 Subject: [PATCH 072/173] add Solr release note #9260 --- doc/release-notes/9260-solr930.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 doc/release-notes/9260-solr930.md diff --git a/doc/release-notes/9260-solr930.md b/doc/release-notes/9260-solr930.md new file mode 100644 index 00000000000..5a9c434a229 --- /dev/null +++ b/doc/release-notes/9260-solr930.md @@ -0,0 +1,3 @@ +Solr has been upgraded to Solr 9. You should install Solr fresh and reindex. + +Note that init scripts have been updated and starting Solr with -Dsolr.modules=scripting is now required. From f92e497c91af45d071b84e930531ae28846496c3 Mon Sep 17 00:00:00 2001 From: Don Sizemore Date: Wed, 16 Aug 2023 11:13:08 -0400 Subject: [PATCH 073/173] #8094 install.py should now want OpenJDK 17 --- scripts/installer/install.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/installer/install.py b/scripts/installer/install.py index a7f11f352ed..700c70dbc28 100644 --- a/scripts/installer/install.py +++ b/scripts/installer/install.py @@ -252,8 +252,8 @@ # 1d. check java version java_version = subprocess.check_output(["java", "-version"], stderr=subprocess.STDOUT).decode() print("Found java version "+java_version) - if not re.search('(1.8|11)', java_version): - sys.exit("Dataverse requires OpenJDK 1.8 or 11. Please make sure it's in your PATH, and try again.") + if not re.search('(17)', java_version): + sys.exit("Dataverse requires OpenJDK 17. Please make sure it's in your PATH, and try again.") # 1e. check if the setup scripts - setup-all.sh, are available as well, maybe? # @todo (?) From 8de674b0152ffe3a9be1619945ce3babfac4e2ee Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Wed, 16 Aug 2023 16:01:46 -0400 Subject: [PATCH 074/173] adjust test to new REST Assured format #8094 --- src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java index 0d67333b153..d333a0ce59a 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java @@ -760,7 +760,7 @@ public void testExcludeEmail() { assertEquals("Dataverse, Admin", XmlPath.from(exportDatasetAsDdi.body().asString()).getString("codeBook.stdyDscr.citation.distStmt.contact")); // no "sammi@sample.com" to be found https://github.com/IQSS/dataverse/issues/3443 - assertEquals("[]", XmlPath.from(exportDatasetAsDdi.body().asString()).getString("codeBook.stdyDscr.citation.distStmt.contact.@email")); + assertEquals(null, XmlPath.from(exportDatasetAsDdi.body().asString()).getString("codeBook.stdyDscr.citation.distStmt.contact.@email")); assertEquals("Sample Datasets, inc.", XmlPath.from(exportDatasetAsDdi.body().asString()).getString("codeBook.stdyDscr.citation.distStmt.contact.@affiliation")); assertEquals(datasetPersistentId, XmlPath.from(exportDatasetAsDdi.body().asString()).getString("codeBook.docDscr.citation.titlStmt.IDNo")); From 4af2d6784df60237d91166546e0089710d06019a Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Thu, 17 Aug 2023 14:01:08 +0200 Subject: [PATCH 075/173] ci(ut): upload war file after unit test build as actions artifact #8094 --- .github/workflows/maven_unit_test.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/maven_unit_test.yml b/.github/workflows/maven_unit_test.yml index 5a7a7f73a71..efa3fa4a471 100644 --- a/.github/workflows/maven_unit_test.yml +++ b/.github/workflows/maven_unit_test.yml @@ -59,6 +59,14 @@ jobs: # We don't want to cache the WAR file, so delete it - run: rm -rf ~/.m2/repository/edu/harvard/iq/dataverse + + # Upload the built war file. For download, it will be wrapped in a ZIP by GitHub. + # See also https://github.com/actions/upload-artifact#zipped-artifact-downloads + - uses: actions/upload-artifact@v3 + with: + name: dataverse-java${{ matrix.jdk }}.war + path: target/dataverse*.war + retention-days: 7 push-app-img: name: Publish App Image permissions: From 2b75d60f1d2cfec0fd647e926195e1ccb8cddae0 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Thu, 17 Aug 2023 14:17:13 +0200 Subject: [PATCH 076/173] docs(app): fix JavaDoc link in DatasetVersion to SchemaDotOrgExporter --- src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java index 5836bd9e175..93f45bd288e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java @@ -1814,7 +1814,7 @@ public String getPublicationDateAsString() { // So something will need to be modified to accommodate this. -- L.A. /** * We call the export format "Schema.org JSON-LD" and extensive Javadoc can - * be found in {@link SchemaDotOrgExporter}. + * be found in {@link edu.harvard.iq.dataverse.export.SchemaDotOrgExporter}. */ public String getJsonLd() { // We show published datasets only for "datePublished" field below. From 2292dfeeda6b7731de7868c2460f37856966eada Mon Sep 17 00:00:00 2001 From: GPortas Date: Thu, 17 Aug 2023 16:58:04 +0100 Subject: [PATCH 077/173] Changed: deploy_beta_testing GitHub action now using flat secrets and payara6 --- .github/workflows/deploy_beta_testing.yml | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/.github/workflows/deploy_beta_testing.yml b/.github/workflows/deploy_beta_testing.yml index 5050da7aa8a..a3ab110235b 100644 --- a/.github/workflows/deploy_beta_testing.yml +++ b/.github/workflows/deploy_beta_testing.yml @@ -8,7 +8,6 @@ on: jobs: build: runs-on: ubuntu-latest - environment: beta-testing steps: - uses: actions/checkout@v3 @@ -38,7 +37,6 @@ jobs: deploy-to-payara: needs: build runs-on: ubuntu-latest - environment: beta-testing steps: - uses: actions/checkout@v3 @@ -55,11 +53,11 @@ jobs: - name: Copy war file to remote instance uses: appleboy/scp-action@master with: - host: ${{ secrets.PAYARA_INSTANCE_HOST }} - username: ${{ secrets.PAYARA_INSTANCE_USERNAME }} - key: ${{ secrets.PAYARA_INSTANCE_SSH_PRIVATE_KEY }} + host: ${{ secrets.BETA_PAYARA_INSTANCE_HOST }} + username: ${{ secrets.BETA_PAYARA_INSTANCE_USERNAME }} + key: ${{ secrets.BETA_PAYARA_INSTANCE_SSH_PRIVATE_KEY }} source: './${{ env.war_file }}' - target: '/home/${{ secrets.PAYARA_INSTANCE_USERNAME }}' + target: '/home/${{ secrets.BETA_PAYARA_INSTANCE_USERNAME }}' overwrite: true - name: Execute payara war deployment remotely @@ -67,17 +65,17 @@ jobs: env: INPUT_WAR_FILE: ${{ env.war_file }} with: - host: ${{ secrets.PAYARA_INSTANCE_HOST }} - username: ${{ secrets.PAYARA_INSTANCE_USERNAME }} - key: ${{ secrets.PAYARA_INSTANCE_SSH_PRIVATE_KEY }} + host: ${{ secrets.BETA_PAYARA_INSTANCE_HOST }} + username: ${{ secrets.BETA_PAYARA_INSTANCE_USERNAME }} + key: ${{ secrets.BETA_PAYARA_INSTANCE_SSH_PRIVATE_KEY }} envs: INPUT_WAR_FILE script: | APPLICATION_NAME=dataverse-backend - ASADMIN='/usr/local/payara5/bin/asadmin --user admin' + ASADMIN='/usr/local/payara6/bin/asadmin --user admin' $ASADMIN undeploy $APPLICATION_NAME $ASADMIN stop-domain - rm -rf /usr/local/payara5/glassfish/domains/domain1/generated - rm -rf /usr/local/payara5/glassfish/domains/domain1/osgi-cache + rm -rf /usr/local/payara6/glassfish/domains/domain1/generated + rm -rf /usr/local/payara6/glassfish/domains/domain1/osgi-cache $ASADMIN start-domain $ASADMIN deploy --name $APPLICATION_NAME $INPUT_WAR_FILE $ASADMIN stop-domain From 75d1f42be9e56ea5fec013ccdcbd78f7a8618a87 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Fri, 18 Aug 2023 09:49:48 +0200 Subject: [PATCH 078/173] build(deps): update to Payara 6.2023.8 #9793 --- doc/sphinx-guides/source/developers/classic-dev-env.rst | 6 +++--- doc/sphinx-guides/source/installation/prerequisites.rst | 6 +++--- downloads/download.sh | 2 +- modules/dataverse-parent/pom.xml | 2 +- scripts/vagrant/setup.sh | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/sphinx-guides/source/developers/classic-dev-env.rst b/doc/sphinx-guides/source/developers/classic-dev-env.rst index 423f609dd2f..6feca558267 100755 --- a/doc/sphinx-guides/source/developers/classic-dev-env.rst +++ b/doc/sphinx-guides/source/developers/classic-dev-env.rst @@ -91,15 +91,15 @@ On Linux, install ``jq`` from your package manager or download a binary from htt Install Payara ~~~~~~~~~~~~~~ -Payara 6.2023.7 or higher is required. +Payara 6.2023.8 or higher is required. To install Payara, run the following commands: ``cd /usr/local`` -``sudo curl -O -L https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/6.2023.7/payara-6.2023.7.zip`` +``sudo curl -O -L https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/6.2023.8/payara-6.2023.8.zip`` -``sudo unzip payara-6.2023.7.zip`` +``sudo unzip payara-6.2023.8.zip`` ``sudo chown -R $USER /usr/local/payara6`` diff --git a/doc/sphinx-guides/source/installation/prerequisites.rst b/doc/sphinx-guides/source/installation/prerequisites.rst index b86bee9cd31..0022da37f5f 100644 --- a/doc/sphinx-guides/source/installation/prerequisites.rst +++ b/doc/sphinx-guides/source/installation/prerequisites.rst @@ -44,7 +44,7 @@ On RHEL/derivative you can make Java 11 the default with the ``alternatives`` co Payara ------ -Payara 6.2023.7 is recommended. Newer versions might work fine. Regular updates are recommended. +Payara 6.2023.8 is recommended. Newer versions might work fine. Regular updates are recommended. Installing Payara ================= @@ -55,8 +55,8 @@ Installing Payara - Download and install Payara (installed in ``/usr/local/payara6`` in the example commands below):: - # wget https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/6.2023.7/payara-6.2023.7.zip - # unzip payara-6.2023.7.zip + # wget https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/6.2023.8/payara-6.2023.8.zip + # unzip payara-6.2023.8.zip # mv payara6 /usr/local If nexus.payara.fish is ever down for maintenance, Payara distributions are also available from https://repo1.maven.org/maven2/fish/payara/distributions/payara/ diff --git a/downloads/download.sh b/downloads/download.sh index 7ccff358820..c5cf4a5f17b 100755 --- a/downloads/download.sh +++ b/downloads/download.sh @@ -1,5 +1,5 @@ #!/bin/sh -curl -L -O https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/6.2023.7/payara-6.2023.7.zip +curl -L -O https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/6.2023.8/payara-6.2023.8.zip curl -L -O https://archive.apache.org/dist/lucene/solr/8.11.1/solr-8.11.1.tgz curl -L -O https://search.maven.org/remotecontent?filepath=org/jboss/weld/weld-osgi-bundle/2.2.10.Final/weld-osgi-bundle-2.2.10.Final-glassfish4.jar curl -s -L http://sourceforge.net/projects/schemaspy/files/schemaspy/SchemaSpy%205.0.0/schemaSpy_5.0.0.jar/download > schemaSpy_5.0.0.jar diff --git a/modules/dataverse-parent/pom.xml b/modules/dataverse-parent/pom.xml index 7c83ac39736..e86ea53652b 100644 --- a/modules/dataverse-parent/pom.xml +++ b/modules/dataverse-parent/pom.xml @@ -148,7 +148,7 @@ -Duser.timezone=${project.timezone} -Dfile.encoding=${project.build.sourceEncoding} -Duser.language=${project.language} -Duser.region=${project.region} - 6.2023.7 + 6.2023.8 42.5.1 8.11.1 1.12.290 diff --git a/scripts/vagrant/setup.sh b/scripts/vagrant/setup.sh index b446e2dd5dc..001c3ec5dd2 100644 --- a/scripts/vagrant/setup.sh +++ b/scripts/vagrant/setup.sh @@ -51,7 +51,7 @@ SOLR_USER=solr echo "Ensuring Unix user '$SOLR_USER' exists" useradd $SOLR_USER || : DOWNLOAD_DIR='/dataverse/downloads' -PAYARA_ZIP="$DOWNLOAD_DIR/payara-6.2023.7.zip" +PAYARA_ZIP="$DOWNLOAD_DIR/payara-6.2023.8.zip" SOLR_TGZ="$DOWNLOAD_DIR/solr-8.11.1.tgz" if [ ! -f $PAYARA_ZIP ] || [ ! -f $SOLR_TGZ ]; then echo "Couldn't find $PAYARA_ZIP or $SOLR_TGZ! Running download script...." From 20d2aa250d8bf8ffec47338302cdc60a2ea63d8a Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Fri, 18 Aug 2023 06:38:28 -0400 Subject: [PATCH 079/173] Revert "add workaround for FISH-7665: Payara doesn't run #8305" #9793 This reverts commit da5193ffd3523a274feab8a083016b68e80202bd. --- modules/container-base/src/main/docker/Dockerfile | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/container-base/src/main/docker/Dockerfile b/modules/container-base/src/main/docker/Dockerfile index 4e11e7835e6..148c29e0ed1 100644 --- a/modules/container-base/src/main/docker/Dockerfile +++ b/modules/container-base/src/main/docker/Dockerfile @@ -75,8 +75,6 @@ WORKDIR / SHELL ["/bin/bash", "-euo", "pipefail", "-c"] # Mark these directories as mutuable data containers to avoid cluttering the images overlayfs at runtime. VOLUME ${STORAGE_DIR} ${SECRETS_DIR} ${DUMPS_DIR} -# Workaround for https://github.com/payara/Payara/issues/6344 -ENV JAVA_TOOL_OPTIONS="-Djdk.util.zip.disableZip64ExtraFieldValidation=true --add-opens=java.base/java.io=ALL-UNNAMED" RUN < Date: Fri, 18 Aug 2023 09:03:54 -0400 Subject: [PATCH 080/173] update to Payara 6.2023.8 #9340 --- doc/release-notes/9340-payara5to6.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/release-notes/9340-payara5to6.md b/doc/release-notes/9340-payara5to6.md index ce41973c874..1962011ab02 100644 --- a/doc/release-notes/9340-payara5to6.md +++ b/doc/release-notes/9340-payara5to6.md @@ -1,12 +1,12 @@ ## Upgrade from Payara 5 to Payara 6 -1. Download Payara 6.2023.7 as of this writing: +1. Download Payara 6.2023.8 as of this writing: - `curl -L -O https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/6.2023.7/payara-6.2023.7.zip` + `curl -L -O https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/6.2023.8/payara-6.2023.8.zip` 1. Unzip it to /usr/local (or your preferred location): - `sudo unzip payara-6.2023.7.zip -d /usr/local/` + `sudo unzip payara-6.2023.8.zip -d /usr/local/` 1. Change ownership of the unzipped Payara to your "service" user ("dataverse" by default): @@ -114,4 +114,4 @@ 1. Perform one final Payara restart to ensure that timers are initialized properly: `sudo -u dataverse /usr/local/payara6/bin/asadmin stop-domain` - `sudo -u dataverse /usr/local/payara6/bin/asadmin start-domain` \ No newline at end of file + `sudo -u dataverse /usr/local/payara6/bin/asadmin start-domain` From 245248c6f8c91a2cf66a4c7c62204a1bcaba3329 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Fri, 18 Aug 2023 16:15:56 +0200 Subject: [PATCH 081/173] build(test): remove JUnit 4 from POM, upgrade to JUnit 5.10 --- modules/dataverse-parent/pom.xml | 6 ++---- pom.xml | 24 ++++++++++++------------ 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/modules/dataverse-parent/pom.xml b/modules/dataverse-parent/pom.xml index 7c83ac39736..eaa79b76355 100644 --- a/modules/dataverse-parent/pom.xml +++ b/modules/dataverse-parent/pom.xml @@ -170,10 +170,8 @@ 1.15.0 2.10.1 - - 4.13.1 - 5.7.0 - ${junit.jupiter.version} + + 5.10.0 2.28.2 9.3 diff --git a/pom.xml b/pom.xml index df8daa7e019..eee3d956f38 100644 --- a/pom.xml +++ b/pom.xml @@ -377,6 +377,12 @@ ezid 1.0.0 jar + + + junit + junit + +
    org.jsoup @@ -542,18 +548,6 @@ ${junit.jupiter.version} test - - junit - junit - ${junit.version} - test - - - org.junit.vintage - junit-vintage-engine - ${junit.vintage.version} - test - org.hamcrest hamcrest-library @@ -594,6 +588,12 @@ org.testcontainers testcontainers test + + + junit + junit + + org.testcontainers From 2ca734eeabb6761b18c4542a45bca62d666da6c7 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Fri, 18 Aug 2023 16:40:02 +0200 Subject: [PATCH 082/173] build(test): migrate all imports from JUnit 4 to JUnit 5 #9782 --- .../AuxiliaryFileServiceBeanTest.java | 7 +- .../edu/harvard/iq/dataverse/CartTest.java | 14 +- .../DataFileCategoryServiceBeanTest.java | 8 +- .../iq/dataverse/DataFileServiceBeanTest.java | 7 +- .../iq/dataverse/DatasetAuthorTest.java | 12 +- .../iq/dataverse/DatasetFieldTypeTest.java | 14 +- .../dataverse/DatasetFieldValidatorTest.java | 13 +- .../edu/harvard/iq/dataverse/DatasetTest.java | 9 +- .../DatasetVersionServiceBeanTest.java | 8 +- .../DataverseMetadataBlockFacetTest.java | 2 +- .../harvard/iq/dataverse/DataverseTest.java | 4 +- .../EditDataFilesPageHelperTest.java | 6 +- .../iq/dataverse/ExternalIdentifierTest.java | 8 +- .../FileDirectoryNameValidatorTest.java | 13 +- .../harvard/iq/dataverse/GlobalIdTest.java | 13 +- .../iq/dataverse/MetadataBlockTest.java | 2 +- .../iq/dataverse/PermissionsWrapperTest.java | 8 +- .../PersistentIdentifierServiceBeanTest.java | 11 +- .../iq/dataverse/RoleAssignmentTest.java | 10 +- .../actionlogging/ActionLogRecordTest.java | 10 +- .../iq/dataverse/api/AbstractApiBeanTest.java | 11 +- .../harvard/iq/dataverse/api/AccessIT.java | 17 +- .../edu/harvard/iq/dataverse/api/AdminIT.java | 11 +- .../iq/dataverse/api/AuxiliaryFilesIT.java | 8 +- .../edu/harvard/iq/dataverse/api/BagIT.java | 6 +- .../iq/dataverse/api/BatchImportIT.java | 4 +- .../iq/dataverse/api/BuiltinUsersIT.java | 8 +- .../iq/dataverse/api/ConfirmEmailIT.java | 6 +- .../harvard/iq/dataverse/api/DataCiteIT.java | 4 +- .../iq/dataverse/api/DataRetrieverApiIT.java | 4 +- .../api/DatasetFieldServiceApiTest.java | 4 +- .../harvard/iq/dataverse/api/DatasetsIT.java | 21 +- .../iq/dataverse/api/DatasetsTest.java | 6 +- .../iq/dataverse/api/DataversesIT.java | 15 +- .../iq/dataverse/api/DataversesTest.java | 9 +- .../iq/dataverse/api/DeactivateUsersIT.java | 4 +- .../iq/dataverse/api/DeleteUsersIT.java | 6 +- .../iq/dataverse/api/DownloadFilesIT.java | 8 +- .../api/DownloadInstanceWriterTest.java | 8 +- .../iq/dataverse/api/DuplicateFilesIT.java | 4 +- .../harvard/iq/dataverse/api/EditDDIIT.java | 13 +- .../iq/dataverse/api/ExternalToolsIT.java | 8 +- .../iq/dataverse/api/FeedbackApiIT.java | 4 +- .../iq/dataverse/api/FileMetadataIT.java | 15 +- .../iq/dataverse/api/FileTypeDetectionIT.java | 4 +- .../edu/harvard/iq/dataverse/api/FilesIT.java | 12 +- .../edu/harvard/iq/dataverse/api/FitsIT.java | 6 +- .../iq/dataverse/api/HarvestingClientsIT.java | 10 +- .../iq/dataverse/api/HarvestingServerIT.java | 17 +- .../iq/dataverse/api/InReviewWorkflowIT.java | 7 +- .../edu/harvard/iq/dataverse/api/IndexIT.java | 10 +- .../edu/harvard/iq/dataverse/api/InfoIT.java | 3 +- .../iq/dataverse/api/InvalidCharactersIT.java | 4 +- .../harvard/iq/dataverse/api/IpGroupsIT.java | 6 +- .../harvard/iq/dataverse/api/LazyRefTest.java | 3 +- .../harvard/iq/dataverse/api/LicensesIT.java | 13 +- .../edu/harvard/iq/dataverse/api/LinkIT.java | 4 +- .../harvard/iq/dataverse/api/LogoutIT.java | 2 +- .../iq/dataverse/api/MakeDataCountApiIT.java | 6 +- .../harvard/iq/dataverse/api/MetricsIT.java | 11 +- .../edu/harvard/iq/dataverse/api/MoveIT.java | 7 +- .../harvard/iq/dataverse/api/NetcdfIT.java | 4 +- .../iq/dataverse/api/NotificationsIT.java | 4 +- .../edu/harvard/iq/dataverse/api/PidsIT.java | 6 +- .../edu/harvard/iq/dataverse/api/ProvIT.java | 6 +- .../iq/dataverse/api/RemoteStoreIT.java | 4 +- .../edu/harvard/iq/dataverse/api/RolesIT.java | 8 +- .../harvard/iq/dataverse/api/S3AccessIT.java | 9 +- .../harvard/iq/dataverse/api/SearchIT.java | 17 +- .../api/SignedUrlAuthMechanismIT.java | 2 +- .../iq/dataverse/api/SignpostingIT.java | 6 +- .../harvard/iq/dataverse/api/SiteMapIT.java | 4 +- .../iq/dataverse/api/StorageSitesIT.java | 4 +- .../edu/harvard/iq/dataverse/api/SwordIT.java | 19 +- .../harvard/iq/dataverse/api/TabularIT.java | 10 +- .../iq/dataverse/api/ThumbnailsIT.java | 2 +- .../edu/harvard/iq/dataverse/api/UsersIT.java | 8 +- .../edu/harvard/iq/dataverse/api/UtilIT.java | 12 +- .../iq/dataverse/api/dto/FieldDTOTest.java | 12 +- .../api/filesystem/FileRecordJobIT.java | 19 +- .../imports/ImportGenericServiceBeanTest.java | 9 +- .../dataverse/authorization/AuthUtilTest.java | 14 +- .../AuthenticatedUserDisplayInfoTest.java | 4 +- .../groups/GroupServiceBeanTest.java | 5 +- .../authorization/groups/GroupUtilTest.java | 4 +- .../impl/explicit/ExplicitGroupTest.java | 8 +- .../groups/impl/ipaddress/IpGroupTest.java | 5 +- .../impl/ipaddress/ip/IPv4AddressTest.java | 6 +- .../impl/ipaddress/ip/IPv6AddressTest.java | 9 +- .../impl/ipaddress/ip/IpAddressRangeTest.java | 4 +- .../impl/ipaddress/ip/IpAddressTest.java | 5 +- .../BuiltinAuthenticationProviderTest.java | 6 +- .../builtin/DataverseUserPageTest.java | 2 +- ...uth2AuthenticationProviderFactoryTest.java | 4 +- .../oauth2/impl/GitHubOAuth2APTest.java | 4 +- .../oauth2/impl/GoogleOAuth2APTest.java | 4 +- .../providers/shib/ShibUtilTest.java | 13 +- .../users/AuthenticatedUserTest.java | 11 +- .../confirmemail/ConfirmEmailDataTest.java | 10 +- .../confirmemail/ConfirmEmailUtilTest.java | 17 +- .../dataaccess/FileAccessIOTest.java | 8 +- .../dataverse/dataaccess/StorageIOTest.java | 5 +- .../dataaccess/SwiftAccessIOTest.java | 9 +- .../DataCaptureModuleServiceBeanIT.java | 8 +- .../DataCaptureModuleUtilTest.java | 6 +- .../iq/dataverse/dataset/DatasetUtilTest.java | 5 +- .../DuplicateFileCheckerTest.java | 10 +- .../OptionalFileParamsTest.java | 13 +- .../VariableMetadataDDIParserTest.java | 4 +- .../dataverse/DataverseUtilTest.java | 8 +- .../iq/dataverse/engine/PermissionTest.java | 5 +- .../impl/AbstractDatasetCommandTest.java | 6 +- .../impl/CreateDatasetVersionCommandTest.java | 8 +- .../impl/CreateDataverseCommandTest.java | 11 +- .../impl/CreatePrivateUrlCommandTest.java | 13 +- .../command/impl/CreateRoleCommandTest.java | 8 +- .../impl/DRSSubmitToArchiveCommandTest.java | 5 +- .../impl/DeletePrivateUrlCommandTest.java | 9 +- ...estPublishedDatasetVersionCommandTest.java | 5 +- .../impl/GetPrivateUrlCommandTest.java | 13 +- .../impl/ListMetadataBlocksCommandTest.java | 4 +- .../command/impl/MoveDatasetCommandTest.java | 14 +- .../impl/MoveDataverseCommandTest.java | 12 +- .../impl/RequestRsyncScriptCommandTest.java | 13 +- .../command/impl/RestrictFileCommandTest.java | 16 +- .../ReturnDatasetToAuthorCommandTest.java | 10 +- .../SubmitDatasetForReviewCommandTest.java | 8 +- .../UpdateDatasetThumbnailCommandTest.java | 13 +- ...dateMetadataBlockFacetRootCommandTest.java | 4 +- .../UpdateMetadataBlockFacetsCommandTest.java | 5 +- .../impl/UpdatePermissionRootCommandTest.java | 9 +- .../export/OpenAireExporterTest.java | 4 +- .../export/SchemaDotOrgExporterTest.java | 4 +- .../ExternalToolServiceBeanTest.java | 7 +- .../externaltools/ExternalToolTest.java | 5 +- .../dataverse/feedback/FeedbackUtilTest.java | 8 +- .../dataverse/ingest/IngestFrequencyTest.java | 6 +- .../iq/dataverse/ingest/IngestUtilTest.java | 8 +- .../ingest/IngestableDataCheckerTest.java | 21 +- .../NetcdfFileMetadataExtractorTest.java | 3 +- .../impl/plugins/csv/CSVFileReaderTest.java | 5 +- .../impl/plugins/dta/DTAFileReaderTest.java | 5 +- .../impl/plugins/dta/DataReaderTest.java | 4 +- .../plugins/dta/NewDTAFileReaderTest.java | 11 +- .../locality/StorageSiteUtilTest.java | 5 +- .../MakeDataCountLoggingServiceBeanTest.java | 8 +- .../makedatacount/MakeDataCountUtilTest.java | 5 +- .../iq/dataverse/metrics/MetricsUtilTest.java | 16 +- .../iq/dataverse/mydata/MyDataUtilTest.java | 27 +- .../mydata/SolrQueryFormatterTest.java | 16 +- .../passwordreset/PasswordResetDataTest.java | 13 +- .../passwordreset/PasswordValidatorTest.java | 12 +- .../dataverse/pidproviders/PidUtilTest.java | 12 +- .../privateurl/PrivateUrlUtilTest.java | 2 +- .../provenance/ProvInvestigatorTest.java | 11 +- ...sitoryStorageAbstractionLayerUtilTest.java | 4 +- .../iq/dataverse/search/IndexUtilTest.java | 14 +- .../search/SearchFilesServiceBeanTest.java | 4 +- .../search/SearchIncludeFragmentTest.java | 2 +- .../search/SolrSearchResultTest.java | 10 +- .../iq/dataverse/search/SortByTest.java | 12 +- .../iq/dataverse/sitemap/SiteMapUtilTest.java | 8 +- .../dataverse/userdata/UserListMakerTest.java | 2 +- .../harvard/iq/dataverse/util/BitSetTest.java | 13 +- .../iq/dataverse/util/BundleUtilTest.java | 10 +- .../util/FileSortFieldAndOrderTest.java | 4 +- .../iq/dataverse/util/FileUtilTest.java | 35 +-- .../iq/dataverse/util/FirstNameTest.java | 6 +- .../iq/dataverse/util/JhoveFileTypeTest.java | 8 +- .../iq/dataverse/util/JsfHelperTest.java | 20 +- .../iq/dataverse/util/LruCacheTest.java | 9 +- .../iq/dataverse/util/MailUtilTest.java | 4 +- .../iq/dataverse/util/OrganizationsTest.java | 6 +- .../dataverse/util/PersonOrOrgUtilTest.java | 6 +- .../iq/dataverse/util/StringUtilTest.java | 260 +++++------------- .../iq/dataverse/util/UrlSignerUtilTest.java | 6 +- .../util/bagit/BagChecksumTypeTest.java | 2 +- .../util/bagit/BagValidationTest.java | 2 +- .../util/bagit/BagValidatorTest.java | 4 +- .../bagit/FileChecksumValidationJobTest.java | 2 +- .../util/bagit/ManifestReaderTest.java | 2 +- .../bagit/data/DataFileDataProviderTest.java | 2 +- .../data/FileDataProviderFactoryTest.java | 2 +- .../bagit/data/FolderDataProviderTest.java | 2 +- .../bagit/data/ZipFileDataProviderTest.java | 2 +- .../file/BagItFileHandlerFactoryTest.java | 6 +- .../BagItFileHandlerPostProcessorTest.java | 2 +- .../util/file/BagItFileHandlerTest.java | 4 +- .../util/file/CreateDataFileResultTest.java | 2 +- .../util/json/DatasetVersionDTOTest.java | 12 +- .../dataverse/util/json/JsonParserTest.java | 15 +- .../dataverse/util/json/JsonPrinterTest.java | 9 +- .../iq/dataverse/util/json/JsonUtilTest.java | 4 +- .../util/shapefile/ShapefileHandlerTest.java | 12 +- .../iq/dataverse/util/xml/XmlPrinterTest.java | 4 +- .../dataverse/util/xml/XmlValidatorTest.java | 13 +- .../validation/PasswordValidatorUtilTest.java | 24 +- 197 files changed, 870 insertions(+), 993 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/AuxiliaryFileServiceBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/AuxiliaryFileServiceBeanTest.java index f04a9e50352..31d7793eac9 100644 --- a/src/test/java/edu/harvard/iq/dataverse/AuxiliaryFileServiceBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/AuxiliaryFileServiceBeanTest.java @@ -3,12 +3,11 @@ import java.util.Arrays; import java.util.List; import jakarta.persistence.EntityManager; -import jakarta.persistence.Query; import jakarta.persistence.TypedQuery; -import static org.junit.Assert.assertEquals; -import org.junit.Test; -import org.junit.Before; +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentMatchers; diff --git a/src/test/java/edu/harvard/iq/dataverse/CartTest.java b/src/test/java/edu/harvard/iq/dataverse/CartTest.java index 7b7ea3331a9..6b44c830ca6 100644 --- a/src/test/java/edu/harvard/iq/dataverse/CartTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/CartTest.java @@ -1,15 +1,15 @@ package edu.harvard.iq.dataverse; -import static org.junit.Assert.fail; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - import java.util.List; import java.util.Map.Entry; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; public class CartTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/DataFileCategoryServiceBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/DataFileCategoryServiceBeanTest.java index edeeea288bf..6e6d176194b 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DataFileCategoryServiceBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DataFileCategoryServiceBeanTest.java @@ -4,12 +4,14 @@ import edu.harvard.iq.dataverse.util.BundleUtil; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; -import org.junit.Test; -import org.junit.runner.RunWith; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import java.util.Arrays; import java.util.List; diff --git a/src/test/java/edu/harvard/iq/dataverse/DataFileServiceBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/DataFileServiceBeanTest.java index 136916cf449..269668b19d7 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DataFileServiceBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DataFileServiceBeanTest.java @@ -1,8 +1,9 @@ package edu.harvard.iq.dataverse; -import org.junit.Before; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; /** * Test that the DataFileServiceBean classifies DataFiles correctly. diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetAuthorTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetAuthorTest.java index fddb95eda9e..78dacf08166 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetAuthorTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetAuthorTest.java @@ -1,16 +1,10 @@ package edu.harvard.iq.dataverse; -import static org.junit.Assert.assertEquals; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; -import java.util.Arrays; -import java.util.Collection; +import static org.junit.jupiter.api.Assertions.assertEquals; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; - -@RunWith(Parameterized.class) public class DatasetAuthorTest { public String idType; diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldTypeTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldTypeTest.java index 5538ad9c11f..ca734eb8635 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldTypeTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldTypeTest.java @@ -6,13 +6,13 @@ package edu.harvard.iq.dataverse; import edu.harvard.iq.dataverse.search.SolrField; -import jakarta.faces.model.SelectItem; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldValidatorTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldValidatorTest.java index a59eaa7fa74..db60e9b1edd 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldValidatorTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldValidatorTest.java @@ -6,12 +6,13 @@ package edu.harvard.iq.dataverse; import jakarta.validation.ConstraintValidatorContext; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + import org.mockito.Mockito; /** diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetTest.java index 45e47460ffe..30d8d0867a0 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetTest.java @@ -3,10 +3,11 @@ import edu.harvard.iq.dataverse.DatasetVersion.VersionState; import edu.harvard.iq.dataverse.mocks.MocksFactory; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; import java.util.ArrayList; import java.util.List; diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetVersionServiceBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetVersionServiceBeanTest.java index 7c608888b7b..ef15372c408 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetVersionServiceBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetVersionServiceBeanTest.java @@ -1,13 +1,13 @@ package edu.harvard.iq.dataverse; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mock; import java.util.Arrays; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; import edu.harvard.iq.dataverse.authorization.AuthenticatedUserDisplayInfo; diff --git a/src/test/java/edu/harvard/iq/dataverse/DataverseMetadataBlockFacetTest.java b/src/test/java/edu/harvard/iq/dataverse/DataverseMetadataBlockFacetTest.java index 7ae2d26a113..e0bcfb2369d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DataverseMetadataBlockFacetTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DataverseMetadataBlockFacetTest.java @@ -3,7 +3,7 @@ import edu.harvard.iq.dataverse.mocks.MocksFactory; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/DataverseTest.java b/src/test/java/edu/harvard/iq/dataverse/DataverseTest.java index cb0561dd0f4..35db6c29e89 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DataverseTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DataverseTest.java @@ -3,8 +3,8 @@ import edu.harvard.iq.dataverse.mocks.MocksFactory; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.List; diff --git a/src/test/java/edu/harvard/iq/dataverse/EditDataFilesPageHelperTest.java b/src/test/java/edu/harvard/iq/dataverse/EditDataFilesPageHelperTest.java index c95f7f105fa..621c05937f5 100644 --- a/src/test/java/edu/harvard/iq/dataverse/EditDataFilesPageHelperTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/EditDataFilesPageHelperTest.java @@ -3,12 +3,12 @@ import edu.harvard.iq.dataverse.util.file.CreateDataFileResult; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import java.util.Arrays; import java.util.Collections; diff --git a/src/test/java/edu/harvard/iq/dataverse/ExternalIdentifierTest.java b/src/test/java/edu/harvard/iq/dataverse/ExternalIdentifierTest.java index c14d2e4086e..dbd732d2e55 100644 --- a/src/test/java/edu/harvard/iq/dataverse/ExternalIdentifierTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/ExternalIdentifierTest.java @@ -1,11 +1,9 @@ package edu.harvard.iq.dataverse; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import java.util.regex.Pattern; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertTrue; public class ExternalIdentifierTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/FileDirectoryNameValidatorTest.java b/src/test/java/edu/harvard/iq/dataverse/FileDirectoryNameValidatorTest.java index 9d49dcdb070..c8d6a8cd747 100644 --- a/src/test/java/edu/harvard/iq/dataverse/FileDirectoryNameValidatorTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/FileDirectoryNameValidatorTest.java @@ -1,13 +1,10 @@ package edu.harvard.iq.dataverse; -import java.util.Arrays; -import java.util.Collection; -import org.junit.Test; -import static org.junit.Assert.*; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; - -@RunWith(Parameterized.class) +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.junit.jupiter.api.Assertions.assertEquals; + public class FileDirectoryNameValidatorTest { public boolean isValid; diff --git a/src/test/java/edu/harvard/iq/dataverse/GlobalIdTest.java b/src/test/java/edu/harvard/iq/dataverse/GlobalIdTest.java index 2b60f2a2864..3c3993d110d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/GlobalIdTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/GlobalIdTest.java @@ -1,14 +1,15 @@ package edu.harvard.iq.dataverse; -import org.junit.Test; -import static org.junit.Assert.*; - -import org.junit.Ignore; -import org.junit.Rule; -import org.junit.rules.ExpectedException; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; import edu.harvard.iq.dataverse.pidproviders.PidUtil; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + /** * * @author rmp553 diff --git a/src/test/java/edu/harvard/iq/dataverse/MetadataBlockTest.java b/src/test/java/edu/harvard/iq/dataverse/MetadataBlockTest.java index 85aaa37bb30..8644de89709 100644 --- a/src/test/java/edu/harvard/iq/dataverse/MetadataBlockTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/MetadataBlockTest.java @@ -3,7 +3,7 @@ import edu.harvard.iq.dataverse.mocks.MocksFactory; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; import java.util.UUID; diff --git a/src/test/java/edu/harvard/iq/dataverse/PermissionsWrapperTest.java b/src/test/java/edu/harvard/iq/dataverse/PermissionsWrapperTest.java index 7ebc7e3c807..0acd7a8dca9 100644 --- a/src/test/java/edu/harvard/iq/dataverse/PermissionsWrapperTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/PermissionsWrapperTest.java @@ -1,12 +1,12 @@ package edu.harvard.iq.dataverse; -import static org.junit.Assert.assertFalse; +import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.mock; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; import edu.harvard.iq.dataverse.authorization.users.GuestUser; diff --git a/src/test/java/edu/harvard/iq/dataverse/PersistentIdentifierServiceBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/PersistentIdentifierServiceBeanTest.java index 2318ebc8f2f..2e943bc7647 100644 --- a/src/test/java/edu/harvard/iq/dataverse/PersistentIdentifierServiceBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/PersistentIdentifierServiceBeanTest.java @@ -10,16 +10,17 @@ import edu.harvard.iq.dataverse.pidproviders.FakePidProviderServiceBean; import edu.harvard.iq.dataverse.pidproviders.PermaLinkPidProviderServiceBean; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; -import static org.junit.Assert.*; + +import static org.junit.jupiter.api.Assertions.*; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/RoleAssignmentTest.java b/src/test/java/edu/harvard/iq/dataverse/RoleAssignmentTest.java index e4b33b83930..6ed5e8c55bc 100644 --- a/src/test/java/edu/harvard/iq/dataverse/RoleAssignmentTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/RoleAssignmentTest.java @@ -1,18 +1,18 @@ package edu.harvard.iq.dataverse; -import org.junit.Test; +import org.junit.jupiter.api.Test; import edu.harvard.iq.dataverse.authorization.DataverseRole; import edu.harvard.iq.dataverse.authorization.RoleAssignee; import edu.harvard.iq.dataverse.authorization.users.GuestUser; import edu.harvard.iq.dataverse.authorization.users.PrivateUrlUser; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertFalse; -import org.junit.After; -import org.junit.Before; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; public class RoleAssignmentTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/actionlogging/ActionLogRecordTest.java b/src/test/java/edu/harvard/iq/dataverse/actionlogging/ActionLogRecordTest.java index 1726ea70114..9641fe57fb6 100644 --- a/src/test/java/edu/harvard/iq/dataverse/actionlogging/ActionLogRecordTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/actionlogging/ActionLogRecordTest.java @@ -1,13 +1,13 @@ package edu.harvard.iq.dataverse.actionlogging; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.Date; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import edu.harvard.iq.dataverse.actionlogging.ActionLogRecord.ActionType; import edu.harvard.iq.dataverse.actionlogging.ActionLogRecord.Result; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/AbstractApiBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/api/AbstractApiBeanTest.java index d16d218d54b..89f2ade1e72 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/AbstractApiBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/AbstractApiBeanTest.java @@ -7,17 +7,16 @@ import java.util.logging.Logger; import jakarta.json.Json; import jakarta.json.JsonObject; -import jakarta.json.JsonObjectBuilder; import jakarta.json.JsonReader; import jakarta.json.JsonWriter; import jakarta.json.JsonWriterFactory; import jakarta.json.stream.JsonGenerator; import jakarta.ws.rs.core.Response; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import org.junit.Before; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; public class AbstractApiBeanTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/AccessIT.java b/src/test/java/edu/harvard/iq/dataverse/api/AccessIT.java index b7bdb17ec83..0f83e1a6de8 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/AccessIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/AccessIT.java @@ -13,19 +13,22 @@ import edu.harvard.iq.dataverse.util.FileUtil; import java.io.IOException; import java.util.zip.ZipInputStream; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; + +import org.hamcrest.MatcherAssert; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import java.util.zip.ZipEntry; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.util.HashMap; import static jakarta.ws.rs.core.Response.Status.OK; import org.hamcrest.collection.IsMapContaining; -import static junit.framework.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; + +import static org.hamcrest.MatcherAssert.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/AdminIT.java b/src/test/java/edu/harvard/iq/dataverse/api/AdminIT.java index c9d262f6437..cf7e43268ba 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/AdminIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/AdminIT.java @@ -17,8 +17,10 @@ import java.util.List; import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; -import org.junit.Test; -import org.junit.BeforeClass; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.BeforeAll; import java.util.Map; import java.util.UUID; @@ -28,11 +30,10 @@ import static jakarta.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR; import static jakarta.ws.rs.core.Response.Status.OK; import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; -import static junit.framework.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.notNullValue; -import static org.junit.Assert.assertTrue; -import org.junit.Ignore; +import static org.junit.jupiter.api.Assertions.assertTrue; public class AdminIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/AuxiliaryFilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/AuxiliaryFilesIT.java index 08643b2f018..a5251de43f4 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/AuxiliaryFilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/AuxiliaryFilesIT.java @@ -13,10 +13,10 @@ import static jakarta.ws.rs.core.Response.Status.NOT_FOUND; import static jakarta.ws.rs.core.Response.Status.OK; import static org.hamcrest.CoreMatchers.equalTo; -import org.junit.Assert; -import static org.junit.Assert.assertTrue; -import org.junit.BeforeClass; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; public class AuxiliaryFilesIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/BagIT.java b/src/test/java/edu/harvard/iq/dataverse/api/BagIT.java index d3ca498e447..2fbd1ef8049 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/BagIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/BagIT.java @@ -6,9 +6,9 @@ import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import static jakarta.ws.rs.core.Response.Status.CREATED; import static jakarta.ws.rs.core.Response.Status.OK; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; public class BagIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/BatchImportIT.java b/src/test/java/edu/harvard/iq/dataverse/api/BatchImportIT.java index aa0fb0d4a1e..db13aace0e1 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/BatchImportIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/BatchImportIT.java @@ -5,8 +5,8 @@ import java.io.File; import com.jayway.restassured.response.Response; import java.util.logging.Logger; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import static jakarta.ws.rs.core.Response.Status.ACCEPTED; import static jakarta.ws.rs.core.Response.Status.OK; import static jakarta.ws.rs.core.Response.Status.CREATED; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/BuiltinUsersIT.java b/src/test/java/edu/harvard/iq/dataverse/api/BuiltinUsersIT.java index 36a56950ec3..5bc7be3d299 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/BuiltinUsersIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/BuiltinUsersIT.java @@ -20,12 +20,12 @@ import static jakarta.ws.rs.core.Response.Status.OK; import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; -import static junit.framework.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.Matchers.startsWith; -import static org.junit.Assert.assertTrue; -import org.junit.BeforeClass; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; public class BuiltinUsersIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/ConfirmEmailIT.java b/src/test/java/edu/harvard/iq/dataverse/api/ConfirmEmailIT.java index e00dba2263b..3db1f6d2d22 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/ConfirmEmailIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/ConfirmEmailIT.java @@ -5,9 +5,9 @@ import com.jayway.restassured.path.json.JsonPath; import com.jayway.restassured.response.Response; import java.util.logging.Logger; -import static junit.framework.Assert.assertEquals; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.Matchers.startsWith; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DataCiteIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DataCiteIT.java index 86c3eed4297..a610b7e4fbf 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DataCiteIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DataCiteIT.java @@ -2,9 +2,9 @@ import com.jayway.restassured.path.json.JsonPath; import com.jayway.restassured.response.Response; -import static junit.framework.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.hamcrest.CoreMatchers.equalTo; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * These tests will only work if you are using "DataCite" rather than "EZID" for diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java index 69d9c78d602..f15a1b8e7ee 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java @@ -3,8 +3,8 @@ import com.jayway.restassured.RestAssured; import com.jayway.restassured.response.Response; import edu.harvard.iq.dataverse.api.auth.ApiKeyAuthMechanism; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import java.util.ArrayList; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DatasetFieldServiceApiTest.java b/src/test/java/edu/harvard/iq/dataverse/api/DatasetFieldServiceApiTest.java index 559e5a7dfba..ca99960f240 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DatasetFieldServiceApiTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DatasetFieldServiceApiTest.java @@ -1,12 +1,12 @@ package edu.harvard.iq.dataverse.api; import edu.harvard.iq.dataverse.util.BundleUtil; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.ArrayList; import java.util.List; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; public class DatasetFieldServiceApiTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java index 4929175b89c..1419784d5fd 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java @@ -9,10 +9,11 @@ import java.util.logging.Logger; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import org.skyscreamer.jsonassert.JSONAssert; -import org.junit.Ignore; +import org.junit.jupiter.api.Disabled; import com.jayway.restassured.path.json.JsonPath; import java.util.List; @@ -75,7 +76,7 @@ import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import org.hamcrest.CoreMatchers; @@ -86,14 +87,10 @@ import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.Matchers.contains; -import org.junit.AfterClass; -import org.junit.Assert; - -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.junit.Assert.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; public class DatasetsIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsTest.java b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsTest.java index fded590d9db..58aa366c9e5 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsTest.java @@ -1,13 +1,13 @@ package edu.harvard.iq.dataverse.api; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.HashSet; import java.util.Set; import java.util.function.Predicate; import java.util.stream.Collectors; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; public class DatasetsTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java index eb8511f8ffe..0a5a773853e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java @@ -22,14 +22,15 @@ import jakarta.ws.rs.core.Response.Status; import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; import static jakarta.ws.rs.core.Response.Status.OK; -import static junit.framework.Assert.assertEquals; -import org.junit.BeforeClass; -import org.junit.Test; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import static org.hamcrest.CoreMatchers.equalTo; -import org.junit.AfterClass; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.nio.file.Files; import com.jayway.restassured.path.json.JsonPath; import org.hamcrest.CoreMatchers; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DataversesTest.java b/src/test/java/edu/harvard/iq/dataverse/api/DataversesTest.java index 75d1259e45d..3733f87255c 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DataversesTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DataversesTest.java @@ -22,18 +22,19 @@ import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; import jakarta.servlet.http.HttpServletRequest; import jakarta.ws.rs.container.ContainerRequestContext; import jakarta.ws.rs.core.Response; +import org.mockito.junit.jupiter.MockitoExtension; + import java.util.Arrays; import java.util.Collections; import java.util.List; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DeactivateUsersIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DeactivateUsersIT.java index 3ffca21d5e6..2af2335b9c7 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DeactivateUsersIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DeactivateUsersIT.java @@ -14,8 +14,8 @@ import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.startsWith; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; public class DeactivateUsersIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DeleteUsersIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DeleteUsersIT.java index e4c72cf4e1d..926ae5d5d8d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DeleteUsersIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DeleteUsersIT.java @@ -17,10 +17,10 @@ import static jakarta.ws.rs.core.Response.Status.CREATED; import static jakarta.ws.rs.core.Response.Status.OK; import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; -import static junit.framework.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.hamcrest.CoreMatchers.equalTo; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; /** * The following query has been helpful in discovering places where user ids diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DownloadFilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DownloadFilesIT.java index dc30c53c8e5..44910d7be29 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DownloadFilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DownloadFilesIT.java @@ -22,10 +22,10 @@ import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; import static org.hamcrest.CoreMatchers.equalTo; -import org.junit.Assert; -import static org.junit.Assert.assertTrue; -import org.junit.BeforeClass; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; public class DownloadFilesIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DownloadInstanceWriterTest.java b/src/test/java/edu/harvard/iq/dataverse/api/DownloadInstanceWriterTest.java index 6de52951077..229c7166835 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DownloadInstanceWriterTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DownloadInstanceWriterTest.java @@ -2,10 +2,10 @@ import edu.harvard.iq.dataverse.dataaccess.Range; import java.util.List; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import org.junit.Before; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; public class DownloadInstanceWriterTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DuplicateFilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DuplicateFilesIT.java index 19adb7ba98f..1516c0c7fc0 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DuplicateFilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DuplicateFilesIT.java @@ -16,8 +16,8 @@ import static jakarta.ws.rs.core.Response.Status.OK; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.nullValue; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; /** * Make assertions about duplicate file names (and maybe in the future, diff --git a/src/test/java/edu/harvard/iq/dataverse/api/EditDDIIT.java b/src/test/java/edu/harvard/iq/dataverse/api/EditDDIIT.java index 5295637dd4f..8dfe36099c6 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/EditDDIIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/EditDDIIT.java @@ -9,8 +9,8 @@ import edu.harvard.iq.dataverse.datavariable.VariableMetadata; import edu.harvard.iq.dataverse.datavariable.VariableMetadataDDIParser; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import java.nio.file.Paths; @@ -27,12 +27,13 @@ import static jakarta.ws.rs.core.Response.Status.OK; -import static junit.framework.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; import java.nio.file.Files; -import static org.junit.Assert.assertTrue; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; public class EditDDIIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/ExternalToolsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/ExternalToolsIT.java index 4d78e535a9b..ddd1f059fac 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/ExternalToolsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/ExternalToolsIT.java @@ -18,10 +18,10 @@ import static jakarta.ws.rs.core.Response.Status.OK; import org.hamcrest.CoreMatchers; import org.hamcrest.Matchers; -import org.junit.BeforeClass; -import org.junit.Test; -import static org.junit.Assert.assertTrue; -import org.junit.Ignore; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.Disabled; public class ExternalToolsIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FeedbackApiIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FeedbackApiIT.java index f61468e28ef..5e21abc6b09 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FeedbackApiIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FeedbackApiIT.java @@ -8,8 +8,8 @@ import static jakarta.ws.rs.core.Response.Status.CREATED; import static jakarta.ws.rs.core.Response.Status.OK; import org.hamcrest.CoreMatchers; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; public class FeedbackApiIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FileMetadataIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FileMetadataIT.java index b05c81abf6a..ebc24d0b23f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FileMetadataIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FileMetadataIT.java @@ -4,19 +4,20 @@ import com.jayway.restassured.http.ContentType; import com.jayway.restassured.response.Response; import org.apache.commons.io.IOUtils; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import java.util.UUID; import static com.jayway.restassured.RestAssured.given; import static jakarta.ws.rs.core.Response.Status.OK; -import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.fail; import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; public class FileMetadataIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FileTypeDetectionIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FileTypeDetectionIT.java index aeab3c00777..dcb0c19eab3 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FileTypeDetectionIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FileTypeDetectionIT.java @@ -10,8 +10,8 @@ import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.nullValue; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; public class FileTypeDetectionIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java index cb13c49083d..ca4597a3680 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java @@ -5,8 +5,8 @@ import java.util.logging.Logger; import edu.harvard.iq.dataverse.api.auth.ApiKeyAuthMechanism; -import org.junit.Test; -import org.junit.BeforeClass; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.BeforeAll; import com.jayway.restassured.path.json.JsonPath; import static com.jayway.restassured.path.json.JsonPath.with; import com.jayway.restassured.path.xml.XmlPath; @@ -29,16 +29,16 @@ import jakarta.json.JsonObjectBuilder; import static jakarta.ws.rs.core.Response.Status.*; -import static junit.framework.Assert.assertEquals; import org.hamcrest.CoreMatchers; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.startsWith; import static org.hamcrest.CoreMatchers.nullValue; import org.hamcrest.Matchers; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; public class FilesIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FitsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FitsIT.java index 66c81898090..da9b5b5ccc5 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FitsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FitsIT.java @@ -11,9 +11,9 @@ import static jakarta.ws.rs.core.Response.Status.CREATED; import static jakarta.ws.rs.core.Response.Status.OK; import static org.hamcrest.CoreMatchers.equalTo; -import static org.junit.Assert.assertTrue; -import org.junit.BeforeClass; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; public class FitsIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/HarvestingClientsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/HarvestingClientsIT.java index 3e36da415f3..bb5b833f6b9 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/HarvestingClientsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/HarvestingClientsIT.java @@ -5,17 +5,17 @@ import com.jayway.restassured.RestAssured; import static com.jayway.restassured.RestAssured.given; import com.jayway.restassured.path.json.JsonPath; -import org.junit.Test; +import org.junit.jupiter.api.Test; import com.jayway.restassured.response.Response; import static jakarta.ws.rs.core.Response.Status.CREATED; import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; import static jakarta.ws.rs.core.Response.Status.ACCEPTED; import static jakarta.ws.rs.core.Response.Status.OK; import static org.hamcrest.CoreMatchers.equalTo; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import org.junit.BeforeClass; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.BeforeAll; /** * This class tests Harvesting Client functionality. diff --git a/src/test/java/edu/harvard/iq/dataverse/api/HarvestingServerIT.java b/src/test/java/edu/harvard/iq/dataverse/api/HarvestingServerIT.java index 65f35f76cb1..3004d0ef1d2 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/HarvestingServerIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/HarvestingServerIT.java @@ -4,13 +4,15 @@ import java.util.logging.Logger; import com.jayway.restassured.RestAssured; import static com.jayway.restassured.RestAssured.given; -import org.junit.BeforeClass; -import org.junit.AfterClass; -import org.junit.Test; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import com.jayway.restassured.response.Response; import com.jayway.restassured.path.xml.XmlPath; import com.jayway.restassured.path.xml.element.Node; + import java.util.ArrayList; import java.util.Collections; import static jakarta.ws.rs.core.Response.Status.OK; @@ -18,10 +20,11 @@ import java.util.List; import java.util.Set; import java.util.HashSet; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.assertEquals; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Tests for the Harvesting Server functionality diff --git a/src/test/java/edu/harvard/iq/dataverse/api/InReviewWorkflowIT.java b/src/test/java/edu/harvard/iq/dataverse/api/InReviewWorkflowIT.java index ca082c5ce95..f88bddb5159 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/InReviewWorkflowIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/InReviewWorkflowIT.java @@ -15,10 +15,9 @@ import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; import static jakarta.ws.rs.core.Response.Status.NO_CONTENT; import static org.hamcrest.CoreMatchers.equalTo; -import org.junit.Assert; -import static org.junit.Assert.assertTrue; -import org.junit.BeforeClass; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; public class InReviewWorkflowIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/IndexIT.java b/src/test/java/edu/harvard/iq/dataverse/api/IndexIT.java index 72d834786a9..91260f61e69 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/IndexIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/IndexIT.java @@ -10,14 +10,14 @@ import java.util.logging.Logger; import static jakarta.ws.rs.core.Response.Status.CREATED; import static jakarta.ws.rs.core.Response.Status.NO_CONTENT; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import static jakarta.ws.rs.core.Response.Status.OK; -import static junit.framework.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import org.hamcrest.CoreMatchers; import static org.hamcrest.CoreMatchers.equalTo; -import org.junit.After; +import org.junit.jupiter.api.AfterEach; public class IndexIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/InfoIT.java b/src/test/java/edu/harvard/iq/dataverse/api/InfoIT.java index 73a1171bf1b..2accf035e2a 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/InfoIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/InfoIT.java @@ -3,7 +3,8 @@ import static com.jayway.restassured.RestAssured.given; import com.jayway.restassured.response.Response; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; -import org.junit.Test; +import org.junit.jupiter.api.Test; + import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.notNullValue; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/InvalidCharactersIT.java b/src/test/java/edu/harvard/iq/dataverse/api/InvalidCharactersIT.java index 63af8ea13e1..3d58ecdd739 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/InvalidCharactersIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/InvalidCharactersIT.java @@ -11,8 +11,8 @@ import static jakarta.ws.rs.core.Response.Status.CREATED; import static jakarta.ws.rs.core.Response.Status.OK; import org.hamcrest.Matchers; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; public class InvalidCharactersIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/IpGroupsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/IpGroupsIT.java index d73f07bd530..40f342af987 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/IpGroupsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/IpGroupsIT.java @@ -12,10 +12,10 @@ import static jakarta.ws.rs.core.Response.Status.CREATED; import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; import static jakarta.ws.rs.core.Response.Status.OK; -import static junit.framework.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.hamcrest.CoreMatchers.equalTo; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; public class IpGroupsIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/LazyRefTest.java b/src/test/java/edu/harvard/iq/dataverse/api/LazyRefTest.java index 72cf6fae875..382a80a3493 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/LazyRefTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/LazyRefTest.java @@ -3,8 +3,7 @@ */ package edu.harvard.iq.dataverse.api; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.Test; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/api/LicensesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/LicensesIT.java index 4e2e5e117fc..b29e6472fcf 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/LicensesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/LicensesIT.java @@ -4,20 +4,15 @@ import com.jayway.restassured.path.json.JsonPath; import com.jayway.restassured.response.Response; -import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; -import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; -import org.junit.Test; -import org.junit.BeforeClass; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.BeforeAll; import java.util.logging.Logger; -import static jakarta.ws.rs.core.Response.Status.CREATED; -import static jakarta.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR; import static jakarta.ws.rs.core.Response.Status.OK; -import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; -import static org.junit.Assert.*; import static org.hamcrest.CoreMatchers.notNullValue; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; public class LicensesIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java b/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java index 5b0c8e56467..8a440da2ace 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java @@ -9,8 +9,8 @@ import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; import static jakarta.ws.rs.core.Response.Status.OK; import static org.hamcrest.CoreMatchers.equalTo; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; public class LinkIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/LogoutIT.java b/src/test/java/edu/harvard/iq/dataverse/api/LogoutIT.java index eaa6fc5270f..f4b60369443 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/LogoutIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/LogoutIT.java @@ -2,7 +2,7 @@ import com.jayway.restassured.RestAssured; import com.jayway.restassured.response.Response; -import org.junit.BeforeClass; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import static jakarta.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/MakeDataCountApiIT.java b/src/test/java/edu/harvard/iq/dataverse/api/MakeDataCountApiIT.java index c85920807fd..107ecece1d7 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/MakeDataCountApiIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/MakeDataCountApiIT.java @@ -9,9 +9,9 @@ import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; import org.apache.commons.io.FileUtils; import static org.hamcrest.CoreMatchers.equalTo; -import org.junit.BeforeClass; -import org.junit.Ignore; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; public class MakeDataCountApiIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/MetricsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/MetricsIT.java index cdbf2251ea3..72e73547979 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/MetricsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/MetricsIT.java @@ -5,11 +5,12 @@ import edu.harvard.iq.dataverse.metrics.MetricsUtil; import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; import static jakarta.ws.rs.core.Response.Status.OK; -import org.junit.AfterClass; -import static org.junit.Assert.assertEquals; -import org.junit.BeforeClass; -import org.junit.Test; -import static org.junit.Assert.assertEquals; +import org.junit.jupiter.api.AfterAll; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; //TODO: These tests are fairly flawed as they don't actually add data to compare on. //To improve these tests we should try adding data and see if the number DOESN'T diff --git a/src/test/java/edu/harvard/iq/dataverse/api/MoveIT.java b/src/test/java/edu/harvard/iq/dataverse/api/MoveIT.java index 537fe09317c..5f9d2f7374b 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/MoveIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/MoveIT.java @@ -17,10 +17,9 @@ import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; import org.hamcrest.CoreMatchers; import static org.hamcrest.CoreMatchers.equalTo; -import org.junit.Assert; -import static org.junit.Assert.assertEquals; -import org.junit.BeforeClass; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; public class MoveIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/NetcdfIT.java b/src/test/java/edu/harvard/iq/dataverse/api/NetcdfIT.java index 0b1862ad687..dd39cc3549d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/NetcdfIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/NetcdfIT.java @@ -14,8 +14,8 @@ import static jakarta.ws.rs.core.Response.Status.OK; import org.hamcrest.CoreMatchers; import static org.hamcrest.CoreMatchers.equalTo; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; public class NetcdfIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/NotificationsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/NotificationsIT.java index f7955726b88..683acf7c541 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/NotificationsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/NotificationsIT.java @@ -7,8 +7,8 @@ import static jakarta.ws.rs.core.Response.Status.CREATED; import static jakarta.ws.rs.core.Response.Status.OK; import static org.hamcrest.CoreMatchers.equalTo; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; public class NotificationsIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/PidsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/PidsIT.java index 7983bf3708e..cc9fe2dd4b3 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/PidsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/PidsIT.java @@ -6,9 +6,9 @@ import static jakarta.ws.rs.core.Response.Status.CREATED; import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; import static jakarta.ws.rs.core.Response.Status.OK; -import org.junit.BeforeClass; -import org.junit.Ignore; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; /** * In order to execute this test code you must be configured with DataCite diff --git a/src/test/java/edu/harvard/iq/dataverse/api/ProvIT.java b/src/test/java/edu/harvard/iq/dataverse/api/ProvIT.java index dc3c01099e3..ddd523bf553 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/ProvIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/ProvIT.java @@ -10,12 +10,12 @@ import static jakarta.ws.rs.core.Response.Status.OK; import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; -import static junit.framework.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.notNullValue; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; public class ProvIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/RemoteStoreIT.java b/src/test/java/edu/harvard/iq/dataverse/api/RemoteStoreIT.java index 286013f7727..48b52d1c892 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/RemoteStoreIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/RemoteStoreIT.java @@ -6,8 +6,8 @@ import jakarta.json.JsonObjectBuilder; import static jakarta.ws.rs.core.Response.Status.CREATED; import static jakarta.ws.rs.core.Response.Status.OK; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; public class RemoteStoreIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/RolesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/RolesIT.java index d1e2ffb2426..6168ff27c4d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/RolesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/RolesIT.java @@ -5,10 +5,12 @@ import com.jayway.restassured.path.json.JsonPath; import com.jayway.restassured.response.Response; import java.util.logging.Logger; -import static junit.framework.Assert.assertEquals; import static org.hamcrest.CoreMatchers.equalTo; -import org.junit.BeforeClass; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/api/S3AccessIT.java b/src/test/java/edu/harvard/iq/dataverse/api/S3AccessIT.java index e39172b4c73..acc47db360a 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/S3AccessIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/S3AccessIT.java @@ -1,16 +1,13 @@ package edu.harvard.iq.dataverse.api; import com.jayway.restassured.RestAssured; -import static com.jayway.restassured.RestAssured.given; import com.jayway.restassured.path.json.JsonPath; import com.jayway.restassured.response.Response; import java.util.logging.Logger; -import static jakarta.ws.rs.core.Response.Status.OK; -import static junit.framework.Assert.assertEquals; -import org.junit.BeforeClass; -import org.junit.Test; -import static org.hamcrest.CoreMatchers.nullValue; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + import static org.hamcrest.Matchers.startsWith; /** diff --git a/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java b/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java index b6823ddbea4..2f67f07d2dc 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java @@ -8,9 +8,10 @@ import java.util.logging.Logger; import jakarta.json.Json; import jakarta.json.JsonObject; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.AfterEach; import edu.harvard.iq.dataverse.util.FileUtil; import java.io.File; import java.io.InputStream; @@ -21,23 +22,23 @@ import static jakarta.ws.rs.core.Response.Status.OK; import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; import org.hamcrest.CoreMatchers; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; import edu.harvard.iq.dataverse.dataaccess.ImageThumbConverter; import java.awt.image.BufferedImage; import java.io.IOException; -import static junit.framework.Assert.assertEquals; import static java.lang.Thread.sleep; import javax.imageio.ImageIO; import static jakarta.ws.rs.core.Response.Status.CREATED; import static jakarta.ws.rs.core.Response.Status.NOT_FOUND; import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; import org.hamcrest.Matchers; -import org.junit.After; -import static org.junit.Assert.assertNotEquals; import jakarta.json.JsonObjectBuilder; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + public class SearchIT { private static final Logger logger = Logger.getLogger(SearchIT.class.getCanonicalName()); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/SignedUrlAuthMechanismIT.java b/src/test/java/edu/harvard/iq/dataverse/api/SignedUrlAuthMechanismIT.java index 729b4f85e9f..ab153ad59bb 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/SignedUrlAuthMechanismIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/SignedUrlAuthMechanismIT.java @@ -2,7 +2,7 @@ import com.jayway.restassured.RestAssured; import com.jayway.restassured.response.Response; -import org.junit.BeforeClass; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import static com.jayway.restassured.RestAssured.get; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/SignpostingIT.java b/src/test/java/edu/harvard/iq/dataverse/api/SignpostingIT.java index 585eac91d18..6e24bad0e01 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/SignpostingIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/SignpostingIT.java @@ -10,15 +10,15 @@ import static jakarta.ws.rs.core.Response.Status.CREATED; import static jakarta.ws.rs.core.Response.Status.OK; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.regex.Matcher; import java.util.regex.Pattern; import jakarta.json.JsonObject; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; public class SignpostingIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/SiteMapIT.java b/src/test/java/edu/harvard/iq/dataverse/api/SiteMapIT.java index 723f05d3802..048bc1c2df5 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/SiteMapIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/SiteMapIT.java @@ -1,8 +1,8 @@ package edu.harvard.iq.dataverse.api; import com.jayway.restassured.RestAssured; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import com.jayway.restassured.response.Response; public class SiteMapIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/StorageSitesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/StorageSitesIT.java index b2f6e6151a1..13b1f36d59a 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/StorageSitesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/StorageSitesIT.java @@ -6,8 +6,8 @@ import edu.harvard.iq.dataverse.util.SystemConfig; import jakarta.json.Json; import jakarta.json.JsonObjectBuilder; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; public class StorageSitesIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/SwordIT.java b/src/test/java/edu/harvard/iq/dataverse/api/SwordIT.java index 95d9525f6db..812fa7897f7 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/SwordIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/SwordIT.java @@ -24,15 +24,16 @@ import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.Matchers.endsWith; import static org.hamcrest.Matchers.startsWith; -import org.junit.AfterClass; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assume.assumeTrue; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.AfterAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assumptions.assumeTrue; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; /** * In all these tests you should never see something like "[long string exposing diff --git a/src/test/java/edu/harvard/iq/dataverse/api/TabularIT.java b/src/test/java/edu/harvard/iq/dataverse/api/TabularIT.java index 70267d70f5b..4afd5058a3a 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/TabularIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/TabularIT.java @@ -10,11 +10,11 @@ import static jakarta.ws.rs.core.Response.Status.CREATED; import static jakarta.ws.rs.core.Response.Status.OK; import static org.hamcrest.CoreMatchers.equalTo; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import org.junit.BeforeClass; -import org.junit.Ignore; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; public class TabularIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/ThumbnailsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/ThumbnailsIT.java index ffa432de63b..7ec3ee10ecb 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/ThumbnailsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/ThumbnailsIT.java @@ -2,7 +2,7 @@ import com.jayway.restassured.response.Response; import org.hamcrest.CoreMatchers; -import org.junit.Test; +import org.junit.jupiter.api.Test; public class ThumbnailsIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java index 76f153721c0..1dd1199ebd6 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java @@ -17,13 +17,13 @@ import static jakarta.ws.rs.core.Response.Status.NOT_FOUND; import static jakarta.ws.rs.core.Response.Status.OK; import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; -import static junit.framework.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.Matchers.contains; -import static org.junit.Assert.assertTrue; -import org.junit.BeforeClass; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; public class UsersIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java index 5f61ab3f2c7..50ce81b4f67 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -9,8 +9,7 @@ import jakarta.json.JsonObjectBuilder; import jakarta.json.JsonArrayBuilder; import jakarta.json.JsonObject; -import jakarta.ws.rs.client.Client; -import jakarta.ws.rs.client.ClientBuilder; + import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -22,7 +21,7 @@ import com.jayway.restassured.path.xml.XmlPath; import edu.harvard.iq.dataverse.mydata.MyDataFilterParams; import org.apache.commons.lang3.StringUtils; -import org.junit.Test; +import org.junit.jupiter.api.Test; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import com.jayway.restassured.specification.RequestSpecification; import java.util.List; @@ -47,11 +46,12 @@ import edu.harvard.iq.dataverse.DatasetFieldType; import edu.harvard.iq.dataverse.DatasetFieldValue; import edu.harvard.iq.dataverse.util.StringUtil; + import java.io.StringReader; import java.util.Collections; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; public class UtilIT { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/dto/FieldDTOTest.java b/src/test/java/edu/harvard/iq/dataverse/api/dto/FieldDTOTest.java index 45f0ef52b33..21e37625543 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/dto/FieldDTOTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/dto/FieldDTOTest.java @@ -11,12 +11,12 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import junit.framework.Assert; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/api/filesystem/FileRecordJobIT.java b/src/test/java/edu/harvard/iq/dataverse/api/filesystem/FileRecordJobIT.java index 5cfce389ed6..25b6ec7371d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/filesystem/FileRecordJobIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/filesystem/FileRecordJobIT.java @@ -30,14 +30,15 @@ import edu.harvard.iq.dataverse.batch.entities.StepExecutionEntity; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.Ignore; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; import jakarta.batch.runtime.BatchStatus; + import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; @@ -56,10 +57,10 @@ import java.util.UUID; import static com.jayway.restassured.RestAssured.given; -import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.assertTrue; -import static junit.framework.Assert.fail; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.hamcrest.Matchers.equalTo; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; /** * Batch File System Import Job Integration Tests diff --git a/src/test/java/edu/harvard/iq/dataverse/api/imports/ImportGenericServiceBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/api/imports/ImportGenericServiceBeanTest.java index 70c53c8c9b9..b2ef3f24ff7 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/imports/ImportGenericServiceBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/imports/ImportGenericServiceBeanTest.java @@ -1,11 +1,12 @@ package edu.harvard.iq.dataverse.api.imports; import edu.harvard.iq.dataverse.api.dto.DatasetDTO; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; @RunWith(MockitoJUnitRunner.class) public class ImportGenericServiceBeanTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/AuthUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/AuthUtilTest.java index a7a33d0c1bd..7e659d03a5d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/AuthUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/AuthUtilTest.java @@ -5,18 +5,16 @@ import edu.harvard.iq.dataverse.authorization.providers.oauth2.impl.GoogleOAuth2AP; import edu.harvard.iq.dataverse.authorization.providers.oauth2.impl.OrcidOAuth2AP; import edu.harvard.iq.dataverse.authorization.providers.shib.ShibAuthenticationProvider; -import java.util.Arrays; import java.util.Collection; import java.util.HashSet; -import org.junit.Test; -import org.junit.experimental.runners.Enclosed; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameter; -import org.junit.runners.Parameterized.Parameters; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; @RunWith(Enclosed.class) public class AuthUtilTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/AuthenticatedUserDisplayInfoTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/AuthenticatedUserDisplayInfoTest.java index c22536e7616..4f04228df71 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/AuthenticatedUserDisplayInfoTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/AuthenticatedUserDisplayInfoTest.java @@ -1,7 +1,7 @@ package edu.harvard.iq.dataverse.authorization; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/GroupServiceBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/GroupServiceBeanTest.java index ea9f851f9ed..7c0c09d6f39 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/GroupServiceBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/GroupServiceBeanTest.java @@ -13,8 +13,9 @@ import java.util.Set; import static java.util.stream.Collectors.toList; import java.util.stream.Stream; -import static org.junit.Assert.assertEquals; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; + import static edu.harvard.iq.dataverse.util.CollectionLiterals.*; /** diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/GroupUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/GroupUtilTest.java index fdfd8d4370c..41a494d5e55 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/GroupUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/GroupUtilTest.java @@ -5,8 +5,8 @@ import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import java.util.LinkedHashSet; import java.util.Set; -import static org.junit.Assert.assertEquals; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; public class GroupUtilTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/explicit/ExplicitGroupTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/explicit/ExplicitGroupTest.java index 543d3ab1eeb..d95a95a8d3a 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/explicit/ExplicitGroupTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/explicit/ExplicitGroupTest.java @@ -16,10 +16,10 @@ import edu.harvard.iq.dataverse.engine.command.DataverseRequest; import edu.harvard.iq.dataverse.mocks.MockRoleAssigneeServiceBean; import static edu.harvard.iq.dataverse.mocks.MocksFactory.*; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.Test; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/IpGroupTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/IpGroupTest.java index b6a3b862435..aeea93ad29e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/IpGroupTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/IpGroupTest.java @@ -5,8 +5,9 @@ import edu.harvard.iq.dataverse.authorization.users.GuestUser; import edu.harvard.iq.dataverse.engine.command.DataverseRequest; import edu.harvard.iq.dataverse.mocks.MocksFactory; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv4AddressTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv4AddressTest.java index d03846a97b4..4bab4546ca4 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv4AddressTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv4AddressTest.java @@ -1,10 +1,10 @@ package edu.harvard.iq.dataverse.authorization.groups.impl.ipaddress.ip; -import java.math.BigDecimal; import java.math.BigInteger; import java.util.Arrays; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv6AddressTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv6AddressTest.java index 2070dc347e7..a6ca37e975c 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv6AddressTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv6AddressTest.java @@ -1,10 +1,11 @@ package edu.harvard.iq.dataverse.authorization.groups.impl.ipaddress.ip; import java.util.Arrays; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IpAddressRangeTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IpAddressRangeTest.java index f232b713640..fe2bde06482 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IpAddressRangeTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IpAddressRangeTest.java @@ -1,7 +1,7 @@ package edu.harvard.iq.dataverse.authorization.groups.impl.ipaddress.ip; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IpAddressTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IpAddressTest.java index ce6ff29f1c1..e757472e316 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IpAddressTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IpAddressTest.java @@ -1,8 +1,9 @@ package edu.harvard.iq.dataverse.authorization.groups.impl.ipaddress.ip; import java.util.Arrays; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/providers/builtin/BuiltinAuthenticationProviderTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/providers/builtin/BuiltinAuthenticationProviderTest.java index ebf22f9dcb4..aceedd970b7 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/providers/builtin/BuiltinAuthenticationProviderTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/providers/builtin/BuiltinAuthenticationProviderTest.java @@ -7,9 +7,9 @@ import edu.harvard.iq.dataverse.mocks.MockBuiltinUserServiceBean; import edu.harvard.iq.dataverse.mocks.MockPasswordValidatorServiceBean; import edu.harvard.iq.dataverse.validation.PasswordValidatorServiceBean; -import org.junit.Test; -import static org.junit.Assert.*; -import org.junit.Before; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.BeforeEach; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/providers/builtin/DataverseUserPageTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/providers/builtin/DataverseUserPageTest.java index defbc4416b5..c81edd6d102 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/providers/builtin/DataverseUserPageTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/providers/builtin/DataverseUserPageTest.java @@ -1,6 +1,6 @@ package edu.harvard.iq.dataverse.authorization.providers.builtin; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mock; import java.sql.Timestamp; diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/OAuth2AuthenticationProviderFactoryTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/OAuth2AuthenticationProviderFactoryTest.java index 5838fdee42c..ae73c505a4b 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/OAuth2AuthenticationProviderFactoryTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/OAuth2AuthenticationProviderFactoryTest.java @@ -2,8 +2,8 @@ import java.util.HashMap; import java.util.Map; -import static org.junit.Assert.assertEquals; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/GitHubOAuth2APTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/GitHubOAuth2APTest.java index 786c30fb2d7..ed6b9789848 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/GitHubOAuth2APTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/GitHubOAuth2APTest.java @@ -2,10 +2,10 @@ import edu.harvard.iq.dataverse.authorization.AuthenticatedUserDisplayInfo; import edu.harvard.iq.dataverse.authorization.providers.oauth2.AbstractOAuth2AuthenticationProvider; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import edu.harvard.iq.dataverse.authorization.providers.oauth2.OAuth2UserRecord; -import org.junit.Test; +import org.junit.jupiter.api.Test; public class GitHubOAuth2APTest extends GitHubOAuth2AP { diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/GoogleOAuth2APTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/GoogleOAuth2APTest.java index d97b0f77daf..cfba755d2a1 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/GoogleOAuth2APTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/GoogleOAuth2APTest.java @@ -3,8 +3,8 @@ import edu.harvard.iq.dataverse.authorization.AuthenticatedUserDisplayInfo; import edu.harvard.iq.dataverse.authorization.providers.oauth2.AbstractOAuth2AuthenticationProvider; import jakarta.json.Json; -import static org.junit.Assert.assertEquals; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; public class GoogleOAuth2APTest extends GoogleOAuth2AP { diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibUtilTest.java index 99a307eebc3..4c444c3e75d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibUtilTest.java @@ -3,21 +3,16 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; -import java.util.Arrays; -import java.util.Collection; import java.util.Map; import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; import jakarta.servlet.http.HttpServletRequest; -import static org.junit.Assert.*; -import org.junit.Test; -import org.junit.experimental.runners.Enclosed; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameter; -import org.junit.runners.Parameterized.Parameters; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mock; @RunWith(Enclosed.class) diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUserTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUserTest.java index 0c535653c35..12e48216f49 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUserTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUserTest.java @@ -18,16 +18,17 @@ import java.util.HashSet; import java.util.Set; -import org.junit.Test; -import static org.junit.Assert.*; -import org.junit.Before; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.extension.ExtendWith; import jakarta.json.JsonObject; import jakarta.json.JsonString; -import org.junit.runner.RunWith; + import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; /** * Tested class: AuthenticatedUser.java diff --git a/src/test/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailDataTest.java b/src/test/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailDataTest.java index 45c4162188a..d807d8b9efe 100644 --- a/src/test/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailDataTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailDataTest.java @@ -1,11 +1,11 @@ package edu.harvard.iq.dataverse.confirmemail; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertTrue; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; diff --git a/src/test/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailUtilTest.java index 8fdc7dc38d5..cf4759fe9f5 100644 --- a/src/test/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailUtilTest.java @@ -1,15 +1,14 @@ package edu.harvard.iq.dataverse.confirmemail; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + import java.sql.Timestamp; -import java.util.Collection; -import java.util.Arrays; - -import static org.junit.Assert.assertEquals; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.experimental.runners.Enclosed; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; @RunWith(Enclosed.class) public class ConfirmEmailUtilTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/dataaccess/FileAccessIOTest.java b/src/test/java/edu/harvard/iq/dataverse/dataaccess/FileAccessIOTest.java index 95621dd8750..d8a94585b38 100644 --- a/src/test/java/edu/harvard/iq/dataverse/dataaccess/FileAccessIOTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/dataaccess/FileAccessIOTest.java @@ -23,13 +23,13 @@ import java.util.ArrayList; import java.util.List; import org.apache.commons.io.FileUtils; -import org.junit.After; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -import org.junit.Before; +import org.junit.jupiter.api.BeforeEach; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/dataaccess/StorageIOTest.java b/src/test/java/edu/harvard/iq/dataverse/dataaccess/StorageIOTest.java index 83cb0c72786..2ed9d18036d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/dataaccess/StorageIOTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/dataaccess/StorageIOTest.java @@ -21,8 +21,9 @@ import java.util.List; //import org.apache.commons.httpclient.Header; //import org.apache.commons.httpclient.methods.GetMethod; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/dataaccess/SwiftAccessIOTest.java b/src/test/java/edu/harvard/iq/dataverse/dataaccess/SwiftAccessIOTest.java index c1aa6b5fca3..115103450b8 100644 --- a/src/test/java/edu/harvard/iq/dataverse/dataaccess/SwiftAccessIOTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/dataaccess/SwiftAccessIOTest.java @@ -12,11 +12,10 @@ import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SignatureException; -import javax.crypto.Mac; -import javax.crypto.spec.SecretKeySpec; -import org.junit.Test; -import static org.junit.Assert.*; -import org.junit.Before; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.BeforeEach; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleServiceBeanIT.java b/src/test/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleServiceBeanIT.java index 1c033e08af2..a37f8b724fe 100644 --- a/src/test/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleServiceBeanIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleServiceBeanIT.java @@ -11,10 +11,10 @@ import java.util.Calendar; import java.util.TimeZone; import java.util.logging.Logger; -import org.junit.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertTrue; import jakarta.json.JsonObject; import static java.lang.Thread.sleep; import jakarta.json.Json; diff --git a/src/test/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleUtilTest.java index afb1f0ec851..eb19f22df63 100644 --- a/src/test/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleUtilTest.java @@ -16,9 +16,9 @@ import org.apache.http.entity.StringEntity; import org.apache.http.impl.DefaultHttpResponseFactory; import org.apache.http.message.BasicStatusLine; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.Test; public class DataCaptureModuleUtilTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/dataset/DatasetUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/dataset/DatasetUtilTest.java index 46bce999c60..8eed2a33c5a 100644 --- a/src/test/java/edu/harvard/iq/dataverse/dataset/DatasetUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/dataset/DatasetUtilTest.java @@ -11,8 +11,9 @@ import edu.harvard.iq.dataverse.mocks.MocksFactory; import java.util.ArrayList; import java.util.List; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; public class DatasetUtilTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/datasetutility/DuplicateFileCheckerTest.java b/src/test/java/edu/harvard/iq/dataverse/datasetutility/DuplicateFileCheckerTest.java index f7fe81b16e3..1fb05becfc8 100644 --- a/src/test/java/edu/harvard/iq/dataverse/datasetutility/DuplicateFileCheckerTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/datasetutility/DuplicateFileCheckerTest.java @@ -1,12 +1,12 @@ package edu.harvard.iq.dataverse.datasetutility; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.mock; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; import edu.harvard.iq.dataverse.DataFile; diff --git a/src/test/java/edu/harvard/iq/dataverse/datasetutility/OptionalFileParamsTest.java b/src/test/java/edu/harvard/iq/dataverse/datasetutility/OptionalFileParamsTest.java index f8c790a566b..c9f251f7e77 100644 --- a/src/test/java/edu/harvard/iq/dataverse/datasetutility/OptionalFileParamsTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/datasetutility/OptionalFileParamsTest.java @@ -10,19 +10,14 @@ import edu.harvard.iq.dataverse.DataFileCategory; import edu.harvard.iq.dataverse.DataFileTag; import edu.harvard.iq.dataverse.FileMetadata; -import java.util.ArrayList; + import java.util.Arrays; import java.util.List; -import java.util.ResourceBundle; import edu.harvard.iq.dataverse.util.BundleUtil; -import org.hamcrest.Matchers; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/datavariable/VariableMetadataDDIParserTest.java b/src/test/java/edu/harvard/iq/dataverse/datavariable/VariableMetadataDDIParserTest.java index 470338d0462..bfb9134cfca 100644 --- a/src/test/java/edu/harvard/iq/dataverse/datavariable/VariableMetadataDDIParserTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/datavariable/VariableMetadataDDIParserTest.java @@ -1,6 +1,6 @@ package edu.harvard.iq.dataverse.datavariable; -import org.junit.Test; +import org.junit.jupiter.api.Test; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; @@ -12,7 +12,7 @@ import java.util.HashSet; import java.util.Collection; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; public class VariableMetadataDDIParserTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/dataverse/DataverseUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/dataverse/DataverseUtilTest.java index cae61afda30..dacebac9117 100644 --- a/src/test/java/edu/harvard/iq/dataverse/dataverse/DataverseUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/dataverse/DataverseUtilTest.java @@ -4,15 +4,17 @@ import edu.harvard.iq.dataverse.Dataverse; import edu.harvard.iq.dataverse.DvObjectContainer; import edu.harvard.iq.dataverse.mocks.MocksFactory; -import static org.junit.Assert.assertEquals; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import java.util.HashMap; import java.util.Map; import jakarta.ws.rs.BadRequestException; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; public class DataverseUtilTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/PermissionTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/PermissionTest.java index ec300a25db7..4b98d3d9850 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/PermissionTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/PermissionTest.java @@ -5,8 +5,9 @@ import edu.harvard.iq.dataverse.Dataset; import edu.harvard.iq.dataverse.Dataverse; import edu.harvard.iq.dataverse.DvObject; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractDatasetCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractDatasetCommandTest.java index a87de12cfe0..388483bfefc 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractDatasetCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractDatasetCommandTest.java @@ -5,10 +5,12 @@ import edu.harvard.iq.dataverse.engine.command.CommandContext; import edu.harvard.iq.dataverse.engine.command.DataverseRequest; import edu.harvard.iq.dataverse.engine.command.exception.CommandException; +import edu.harvard.iq.dataverse.engine.command.exception.IllegalCommandException; import edu.harvard.iq.dataverse.mocks.MocksFactory; import static edu.harvard.iq.dataverse.mocks.MocksFactory.*; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDatasetVersionCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDatasetVersionCommandTest.java index dd8901a05dc..ca266d5208f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDatasetVersionCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDatasetVersionCommandTest.java @@ -16,9 +16,11 @@ import java.util.HashMap; import java.util.Map; import java.util.Set; -import org.junit.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java index bcbc12d5d4e..985c70f834e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java @@ -15,14 +15,15 @@ import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.authorization.users.GuestUser; import edu.harvard.iq.dataverse.search.IndexServiceBean; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import static edu.harvard.iq.dataverse.mocks.MocksFactory.*; import edu.harvard.iq.dataverse.engine.TestCommandContext; import edu.harvard.iq.dataverse.engine.TestDataverseEngine; import edu.harvard.iq.dataverse.engine.command.DataverseRequest; import edu.harvard.iq.dataverse.engine.command.exception.CommandException; import edu.harvard.iq.dataverse.engine.command.exception.IllegalCommandException; + import java.sql.Timestamp; import java.util.ArrayList; import java.util.Arrays; @@ -31,9 +32,9 @@ import java.util.List; import java.util.Map; import java.util.concurrent.Future; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreatePrivateUrlCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreatePrivateUrlCommandTest.java index aafad58654e..104a4f595a8 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreatePrivateUrlCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreatePrivateUrlCommandTest.java @@ -14,12 +14,13 @@ import edu.harvard.iq.dataverse.util.SystemConfig; import java.util.ArrayList; import java.util.List; -import org.junit.Before; -import org.junit.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertTrue; public class CreatePrivateUrlCommandTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateRoleCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateRoleCommandTest.java index 10981fb8d0e..bd42a5469b3 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateRoleCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateRoleCommandTest.java @@ -16,9 +16,11 @@ import edu.harvard.iq.dataverse.mocks.MocksFactory; import jakarta.persistence.EntityManager; import jakarta.persistence.TypedQuery; -import static org.junit.Assert.assertTrue; -import org.junit.Before; -import org.junit.Test; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Matchers; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/DRSSubmitToArchiveCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/DRSSubmitToArchiveCommandTest.java index a0e79268e3d..d91384557fb 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/DRSSubmitToArchiveCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/DRSSubmitToArchiveCommandTest.java @@ -1,19 +1,20 @@ package edu.harvard.iq.dataverse.engine.command.impl; import org.erdtman.jcs.JsonCanonicalizer; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; import com.auth0.jwt.JWT; import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.interfaces.DecodedJWT; import edu.harvard.iq.dataverse.engine.command.exception.CommandException; + import java.security.KeyFactory; import java.security.interfaces.RSAPrivateKey; //import java.security.interfaces.RSAPublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.util.Base64; +import static org.junit.jupiter.api.Assertions.fail; public class DRSSubmitToArchiveCommandTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/DeletePrivateUrlCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/DeletePrivateUrlCommandTest.java index 74c8c269b4b..73b160e620d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/DeletePrivateUrlCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/DeletePrivateUrlCommandTest.java @@ -13,10 +13,11 @@ import edu.harvard.iq.dataverse.privateurl.PrivateUrlServiceBean; import java.util.ArrayList; import java.util.List; -import org.junit.Before; -import org.junit.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; public class DeletePrivateUrlCommandTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/GetLatestPublishedDatasetVersionCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/GetLatestPublishedDatasetVersionCommandTest.java index 24c48fd257b..935da493c35 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/GetLatestPublishedDatasetVersionCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/GetLatestPublishedDatasetVersionCommandTest.java @@ -9,8 +9,9 @@ import edu.harvard.iq.dataverse.engine.command.exception.CommandException; import java.util.ArrayList; import java.util.List; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; import static edu.harvard.iq.dataverse.mocks.MocksFactory.makeRequest; /** diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/GetPrivateUrlCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/GetPrivateUrlCommandTest.java index b5019807ac1..d15162e4053 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/GetPrivateUrlCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/GetPrivateUrlCommandTest.java @@ -5,13 +5,12 @@ import edu.harvard.iq.dataverse.engine.TestDataverseEngine; import edu.harvard.iq.dataverse.privateurl.PrivateUrl; import edu.harvard.iq.dataverse.privateurl.PrivateUrlServiceBean; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Assert; -import static org.junit.Assert.assertNull; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import static org.junit.jupiter.api.Assertions.assertNull; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; public class GetPrivateUrlCommandTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/ListMetadataBlocksCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/ListMetadataBlocksCommandTest.java index 520c91f47ff..83780552639 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/ListMetadataBlocksCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/ListMetadataBlocksCommandTest.java @@ -9,8 +9,8 @@ import edu.harvard.iq.dataverse.mocks.MocksFactory; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; import java.util.Arrays; diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDatasetCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDatasetCommandTest.java index 2d0f52779c3..7c883b18cb5 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDatasetCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDatasetCommandTest.java @@ -48,13 +48,13 @@ import jakarta.persistence.metamodel.Metamodel; import jakarta.servlet.http.HttpServletRequest; import jakarta.ws.rs.core.Context; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.fail; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.fail; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDataverseCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDataverseCommandTest.java index 9568d58aafb..ce56a732267 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDataverseCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDataverseCommandTest.java @@ -27,12 +27,12 @@ import java.util.concurrent.Future; import jakarta.persistence.EntityManager; import jakarta.servlet.http.HttpServletRequest; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.fail; -import org.junit.Before; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.fail; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/RequestRsyncScriptCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/RequestRsyncScriptCommandTest.java index 6eeaa34bf4e..fef4b03b9a3 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/RequestRsyncScriptCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/RequestRsyncScriptCommandTest.java @@ -10,12 +10,13 @@ import edu.harvard.iq.dataverse.mocks.MocksFactory; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import jakarta.servlet.http.HttpServletRequest; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; public class RequestRsyncScriptCommandTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/RestrictFileCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/RestrictFileCommandTest.java index 7b663389a3a..2e1abefb4d8 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/RestrictFileCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/RestrictFileCommandTest.java @@ -18,13 +18,15 @@ import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import java.sql.Timestamp; import java.util.Date; -import org.junit.After; -import org.junit.AfterClass; -import static org.junit.Assert.assertEquals; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import static org.junit.Assert.assertTrue; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.AfterAll; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertTrue; /** diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/ReturnDatasetToAuthorCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/ReturnDatasetToAuthorCommandTest.java index 7f776fb894c..e70771a3348 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/ReturnDatasetToAuthorCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/ReturnDatasetToAuthorCommandTest.java @@ -27,11 +27,11 @@ import jakarta.persistence.EntityManager; import jakarta.servlet.http.HttpServletRequest; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import org.junit.Before; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; public class ReturnDatasetToAuthorCommandTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/SubmitDatasetForReviewCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/SubmitDatasetForReviewCommandTest.java index f3d59455ac0..74a632e510a 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/SubmitDatasetForReviewCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/SubmitDatasetForReviewCommandTest.java @@ -27,10 +27,10 @@ import jakarta.persistence.EntityManager; import jakarta.servlet.http.HttpServletRequest; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import org.junit.Before; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; public class SubmitDatasetForReviewCommandTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetThumbnailCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetThumbnailCommandTest.java index f55e9a2d085..45ecd1e03dd 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetThumbnailCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetThumbnailCommandTest.java @@ -9,12 +9,13 @@ import edu.harvard.iq.dataverse.engine.TestDataverseEngine; import edu.harvard.iq.dataverse.engine.command.exception.CommandException; import edu.harvard.iq.dataverse.util.SystemConfig; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; public class UpdateDatasetThumbnailCommandTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateMetadataBlockFacetRootCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateMetadataBlockFacetRootCommandTest.java index 711e7881af5..492344ea072 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateMetadataBlockFacetRootCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateMetadataBlockFacetRootCommandTest.java @@ -8,8 +8,8 @@ import edu.harvard.iq.dataverse.engine.command.exception.CommandException; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateMetadataBlockFacetsCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateMetadataBlockFacetsCommandTest.java index 2d64de80f3d..e2a08a6add4 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateMetadataBlockFacetsCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateMetadataBlockFacetsCommandTest.java @@ -9,8 +9,9 @@ import edu.harvard.iq.dataverse.mocks.MocksFactory; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; import java.util.Arrays; diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdatePermissionRootCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdatePermissionRootCommandTest.java index 3dced0aaf05..d2e64b3292d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdatePermissionRootCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdatePermissionRootCommandTest.java @@ -7,10 +7,11 @@ import edu.harvard.iq.dataverse.engine.TestCommandContext; import edu.harvard.iq.dataverse.engine.TestDataverseEngine; import edu.harvard.iq.dataverse.engine.command.exception.CommandException; -import org.junit.Before; -import org.junit.Test; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/export/OpenAireExporterTest.java b/src/test/java/edu/harvard/iq/dataverse/export/OpenAireExporterTest.java index aa1668201ba..18f548b7f48 100644 --- a/src/test/java/edu/harvard/iq/dataverse/export/OpenAireExporterTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/export/OpenAireExporterTest.java @@ -5,7 +5,7 @@ import io.gdcc.spi.export.ExportDataProvider; import io.gdcc.spi.export.XMLExporter; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -19,7 +19,7 @@ import jakarta.json.JsonReader; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; diff --git a/src/test/java/edu/harvard/iq/dataverse/export/SchemaDotOrgExporterTest.java b/src/test/java/edu/harvard/iq/dataverse/export/SchemaDotOrgExporterTest.java index 47333e5c1d9..7183f5bd497 100644 --- a/src/test/java/edu/harvard/iq/dataverse/export/SchemaDotOrgExporterTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/export/SchemaDotOrgExporterTest.java @@ -40,9 +40,7 @@ import org.junit.jupiter.api.Test; import org.mockito.Mockito; -import static org.junit.Assert.assertFalse; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.*; /** * For docs see {@link SchemaDotOrgExporter}. diff --git a/src/test/java/edu/harvard/iq/dataverse/externaltools/ExternalToolServiceBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/externaltools/ExternalToolServiceBeanTest.java index 5e39e5fc4cb..9337949f605 100644 --- a/src/test/java/edu/harvard/iq/dataverse/externaltools/ExternalToolServiceBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/externaltools/ExternalToolServiceBeanTest.java @@ -13,10 +13,9 @@ import java.util.List; import jakarta.json.Json; import jakarta.json.JsonObjectBuilder; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import org.junit.Test; + +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; public class ExternalToolServiceBeanTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/externaltools/ExternalToolTest.java b/src/test/java/edu/harvard/iq/dataverse/externaltools/ExternalToolTest.java index e236ab5ff16..4cec93581c2 100644 --- a/src/test/java/edu/harvard/iq/dataverse/externaltools/ExternalToolTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/externaltools/ExternalToolTest.java @@ -1,10 +1,11 @@ package edu.harvard.iq.dataverse.externaltools; import jakarta.json.JsonObject; -import static org.junit.Assert.assertEquals; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; import edu.harvard.iq.dataverse.DataFileServiceBean; + import java.util.ArrayList; import java.util.List; diff --git a/src/test/java/edu/harvard/iq/dataverse/feedback/FeedbackUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/feedback/FeedbackUtilTest.java index ab624a69dad..ecb7014af7d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/feedback/FeedbackUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/feedback/FeedbackUtilTest.java @@ -34,10 +34,10 @@ import jakarta.json.JsonReader; import jakarta.mail.internet.AddressException; import jakarta.mail.internet.InternetAddress; -import org.junit.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import org.junit.BeforeClass; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.BeforeAll; import org.mockito.Mockito; public class FeedbackUtilTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/ingest/IngestFrequencyTest.java b/src/test/java/edu/harvard/iq/dataverse/ingest/IngestFrequencyTest.java index e9191fab559..96e314324ab 100644 --- a/src/test/java/edu/harvard/iq/dataverse/ingest/IngestFrequencyTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/ingest/IngestFrequencyTest.java @@ -6,7 +6,7 @@ import edu.harvard.iq.dataverse.ingest.tabulardata.TabularDataFileReader; import edu.harvard.iq.dataverse.ingest.tabulardata.TabularDataIngest; -import org.junit.Test; +import org.junit.jupiter.api.Test; import jakarta.ejb.EJB; import java.io.File; @@ -16,8 +16,8 @@ import java.io.BufferedInputStream; import java.util.Collection; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; public class IngestFrequencyTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/ingest/IngestUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/ingest/IngestUtilTest.java index b5160a72166..4dfedf5aa17 100644 --- a/src/test/java/edu/harvard/iq/dataverse/ingest/IngestUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/ingest/IngestUtilTest.java @@ -17,13 +17,13 @@ import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; -import jakarta.json.Json; -import jakarta.json.JsonArray; + import jakarta.validation.ConstraintViolation; import org.dataverse.unf.UNFUtil; import org.dataverse.unf.UnfException; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; public class IngestUtilTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/ingest/IngestableDataCheckerTest.java b/src/test/java/edu/harvard/iq/dataverse/ingest/IngestableDataCheckerTest.java index ea9e378739b..305dcf82260 100644 --- a/src/test/java/edu/harvard/iq/dataverse/ingest/IngestableDataCheckerTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/ingest/IngestableDataCheckerTest.java @@ -10,15 +10,18 @@ import java.io.IOException; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; -import org.apache.commons.io.FileUtils; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import static org.junit.Assert.*; -import org.junit.Rule; -import org.junit.rules.TemporaryFolder; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/ingest/metadataextraction/impl/plugins/netcdf/NetcdfFileMetadataExtractorTest.java b/src/test/java/edu/harvard/iq/dataverse/ingest/metadataextraction/impl/plugins/netcdf/NetcdfFileMetadataExtractorTest.java index 203fc96e70a..343d7f39cf5 100644 --- a/src/test/java/edu/harvard/iq/dataverse/ingest/metadataextraction/impl/plugins/netcdf/NetcdfFileMetadataExtractorTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/ingest/metadataextraction/impl/plugins/netcdf/NetcdfFileMetadataExtractorTest.java @@ -5,8 +5,7 @@ import java.io.File; import java.util.Map; import java.util.Set; -import static org.junit.Assert.assertNull; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; public class NetcdfFileMetadataExtractorTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/csv/CSVFileReaderTest.java b/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/csv/CSVFileReaderTest.java index cdc4249ba94..0d9f7d7ccce 100644 --- a/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/csv/CSVFileReaderTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/csv/CSVFileReaderTest.java @@ -22,8 +22,9 @@ import java.util.logging.Logger; import org.dataverse.unf.UNFUtil; import org.dataverse.unf.UnfException; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/dta/DTAFileReaderTest.java b/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/dta/DTAFileReaderTest.java index 2f8908c5920..113e9be6b54 100644 --- a/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/dta/DTAFileReaderTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/dta/DTAFileReaderTest.java @@ -5,8 +5,9 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; -import org.junit.Test; -import static org.junit.Assert.assertEquals; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; public class DTAFileReaderTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/dta/DataReaderTest.java b/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/dta/DataReaderTest.java index 8ac84d9693a..940d625115c 100644 --- a/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/dta/DataReaderTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/dta/DataReaderTest.java @@ -4,8 +4,8 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.nio.ByteBuffer; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; /** * @author oscardssmith diff --git a/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/dta/NewDTAFileReaderTest.java b/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/dta/NewDTAFileReaderTest.java index 3c8c0a0d224..6960a6d0e7f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/dta/NewDTAFileReaderTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/dta/NewDTAFileReaderTest.java @@ -4,19 +4,16 @@ import edu.harvard.iq.dataverse.datavariable.DataVariable; import edu.harvard.iq.dataverse.datavariable.VariableCategory; import edu.harvard.iq.dataverse.ingest.tabulardata.TabularDataIngest; -import edu.harvard.iq.dataverse.ingest.tabulardata.impl.plugins.dta.DataReader; + import java.io.BufferedInputStream; -import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; -import java.nio.ByteBuffer; import java.util.List; import org.apache.commons.io.FileUtils; -import org.junit.Test; -import static org.junit.Assert.*; -import org.junit.Ignore; -import org.junit.Assert; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; public class NewDTAFileReaderTest { NewDTAFileReader instance; diff --git a/src/test/java/edu/harvard/iq/dataverse/locality/StorageSiteUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/locality/StorageSiteUtilTest.java index f35296e560b..6bc7aaad186 100644 --- a/src/test/java/edu/harvard/iq/dataverse/locality/StorageSiteUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/locality/StorageSiteUtilTest.java @@ -4,8 +4,11 @@ import java.util.ArrayList; import java.util.List; import jakarta.json.Json; +import jakarta.json.JsonObject; import jakarta.json.JsonObjectBuilder; -import org.junit.Test; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertThrows; public class StorageSiteUtilTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/makedatacount/MakeDataCountLoggingServiceBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/makedatacount/MakeDataCountLoggingServiceBeanTest.java index ef30df11e3c..c1051a57db8 100644 --- a/src/test/java/edu/harvard/iq/dataverse/makedatacount/MakeDataCountLoggingServiceBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/makedatacount/MakeDataCountLoggingServiceBeanTest.java @@ -16,11 +16,13 @@ import edu.harvard.iq.dataverse.makedatacount.MakeDataCountLoggingServiceBean.MakeDataCountEntry; import edu.harvard.iq.dataverse.mocks.MocksFactory; import java.util.Date; -import jakarta.faces.context.FacesContext; + import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertThat; -import org.junit.Test; +import static org.hamcrest.MatcherAssert.assertThat; + +import org.hamcrest.MatcherAssert; +import org.junit.jupiter.api.Test; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/makedatacount/MakeDataCountUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/makedatacount/MakeDataCountUtilTest.java index 11664b4e18b..5a0ad3d8754 100644 --- a/src/test/java/edu/harvard/iq/dataverse/makedatacount/MakeDataCountUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/makedatacount/MakeDataCountUtilTest.java @@ -6,8 +6,9 @@ import java.util.List; import jakarta.json.Json; import jakarta.json.JsonObject; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; public class MakeDataCountUtilTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/metrics/MetricsUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/metrics/MetricsUtilTest.java index 41aa2dfb5f3..827e450eff7 100644 --- a/src/test/java/edu/harvard/iq/dataverse/metrics/MetricsUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/metrics/MetricsUtilTest.java @@ -12,17 +12,15 @@ import jakarta.json.JsonArray; import jakarta.json.JsonArrayBuilder; import jakarta.json.JsonObject; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; -import org.junit.Test; -import org.junit.experimental.runners.Enclosed; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameter; -import org.junit.runners.Parameterized.Parameters; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.fail; -@RunWith(Enclosed.class) public class MetricsUtilTest { public static class MetricsUtilNoParamTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/mydata/MyDataUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/mydata/MyDataUtilTest.java index 69996ce71fe..5aa840981ad 100644 --- a/src/test/java/edu/harvard/iq/dataverse/mydata/MyDataUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/mydata/MyDataUtilTest.java @@ -1,26 +1,15 @@ package edu.harvard.iq.dataverse.mydata; -import static org.junit.Assert.assertTrue; -import static org.junit.Assume.assumeTrue; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EmptySource; +import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.NullSource; -import org.junit.experimental.theories.DataPoints; -import org.junit.experimental.theories.Theories; -import org.junit.experimental.theories.Theory; -import org.junit.runner.RunWith; +import java.util.List; -/** - * Theories allows to add more formal tests to our code. In a way JUnit Theories behave - * much like mathematical theories that hold for every element of a large (infinite) set. - * JUnit will combine every possible combination (cartesian product) of datapoints and - * pass these to the tests annotated with @Theory. The assume statements make sure, only - * valid datapoints are tested in each Theory. - * - * @Datapoints - defines an array of values to test on - * @Datapoint - stores one single value - * - * JUnit will no longer maintain a JUnit 4 Theories equivalent in the JUnit 5 codebase, as - * mentioned in a discussion here: https://github.com/junit-team/junit5/pull/1422#issuecomment-389644868 - */ +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assumptions.assumeTrue; @RunWith(Theories.class) public class MyDataUtilTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/mydata/SolrQueryFormatterTest.java b/src/test/java/edu/harvard/iq/dataverse/mydata/SolrQueryFormatterTest.java index c15bc280316..9cd4cfcf41f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/mydata/SolrQueryFormatterTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/mydata/SolrQueryFormatterTest.java @@ -5,8 +5,9 @@ */ package edu.harvard.iq.dataverse.mydata; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.fail; import java.lang.NullPointerException; import java.util.ArrayList; @@ -16,14 +17,13 @@ import java.util.List; import java.util.Random; import java.util.Set; +import java.util.stream.Stream; import org.apache.commons.lang3.StringUtils; -import org.junit.Test; -import org.junit.experimental.runners.Enclosed; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameter; -import org.junit.runners.Parameterized.Parameters; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/passwordreset/PasswordResetDataTest.java b/src/test/java/edu/harvard/iq/dataverse/passwordreset/PasswordResetDataTest.java index 9d5b5e0e70e..0d04d715d19 100644 --- a/src/test/java/edu/harvard/iq/dataverse/passwordreset/PasswordResetDataTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/passwordreset/PasswordResetDataTest.java @@ -5,12 +5,13 @@ */ package edu.harvard.iq.dataverse.passwordreset; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; public class PasswordResetDataTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/passwordreset/PasswordValidatorTest.java b/src/test/java/edu/harvard/iq/dataverse/passwordreset/PasswordValidatorTest.java index f6d02e35ddf..6812ebf382c 100644 --- a/src/test/java/edu/harvard/iq/dataverse/passwordreset/PasswordValidatorTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/passwordreset/PasswordValidatorTest.java @@ -1,14 +1,12 @@ package edu.harvard.iq.dataverse.passwordreset; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; -import java.util.Arrays; -import java.util.Collection; +import java.util.stream.Stream; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; @RunWith(Parameterized.class) public class PasswordValidatorTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/pidproviders/PidUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/pidproviders/PidUtilTest.java index 3a35303d7bb..52dab3ddb6d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/pidproviders/PidUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/pidproviders/PidUtilTest.java @@ -11,15 +11,17 @@ import jakarta.json.JsonObjectBuilder; import jakarta.ws.rs.NotFoundException; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; -import org.mockito.junit.MockitoJUnitRunner; -import org.junit.Before; -import org.junit.Ignore; +import org.mockito.junit.jupiter.MockitoExtension; + import static org.junit.jupiter.api.Assertions.*; /** diff --git a/src/test/java/edu/harvard/iq/dataverse/privateurl/PrivateUrlUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/privateurl/PrivateUrlUtilTest.java index 3984f972308..8c9e0261bfa 100644 --- a/src/test/java/edu/harvard/iq/dataverse/privateurl/PrivateUrlUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/privateurl/PrivateUrlUtilTest.java @@ -14,7 +14,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import org.junit.Assert; + import org.junit.jupiter.api.Test; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.params.ParameterizedTest; diff --git a/src/test/java/edu/harvard/iq/dataverse/provenance/ProvInvestigatorTest.java b/src/test/java/edu/harvard/iq/dataverse/provenance/ProvInvestigatorTest.java index efa83fbb950..20b62bcbb0e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/provenance/ProvInvestigatorTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/provenance/ProvInvestigatorTest.java @@ -6,14 +6,15 @@ package edu.harvard.iq.dataverse.provenance; import com.google.gson.JsonParser; -import edu.harvard.iq.dataverse.NonEssentialTests; import java.io.IOException; import java.util.HashMap; import java.util.logging.Logger; -import static org.junit.Assert.*; -import org.junit.Before; -import org.junit.Test; -import org.junit.experimental.categories.Category; +import static org.junit.jupiter.api.Assertions.*; + +import edu.harvard.iq.dataverse.util.testing.Tags; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/repositorystorageabstractionlayer/RepositoryStorageAbstractionLayerUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/repositorystorageabstractionlayer/RepositoryStorageAbstractionLayerUtilTest.java index b45da0f68f8..99fd3b2766f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/repositorystorageabstractionlayer/RepositoryStorageAbstractionLayerUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/repositorystorageabstractionlayer/RepositoryStorageAbstractionLayerUtilTest.java @@ -6,8 +6,8 @@ import java.util.List; import jakarta.json.JsonArray; import jakarta.json.JsonObject; -import static org.junit.Assert.assertEquals; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; public class RepositoryStorageAbstractionLayerUtilTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/search/IndexUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/search/IndexUtilTest.java index 6599f829673..84ea519e71f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/search/IndexUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/search/IndexUtilTest.java @@ -1,13 +1,13 @@ package edu.harvard.iq.dataverse.search; import java.util.Arrays; -import java.util.List; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import static org.junit.Assert.*; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; public class IndexUtilTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/search/SearchFilesServiceBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/search/SearchFilesServiceBeanTest.java index 0ea5597b905..c9f9eb67130 100644 --- a/src/test/java/edu/harvard/iq/dataverse/search/SearchFilesServiceBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/search/SearchFilesServiceBeanTest.java @@ -1,7 +1,7 @@ package edu.harvard.iq.dataverse.search; -import static org.junit.Assert.assertEquals; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; public class SearchFilesServiceBeanTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/search/SearchIncludeFragmentTest.java b/src/test/java/edu/harvard/iq/dataverse/search/SearchIncludeFragmentTest.java index f94da336ca3..234d72c0d19 100644 --- a/src/test/java/edu/harvard/iq/dataverse/search/SearchIncludeFragmentTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/search/SearchIncludeFragmentTest.java @@ -5,7 +5,7 @@ import edu.harvard.iq.dataverse.MetadataBlock; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; import java.util.Arrays; diff --git a/src/test/java/edu/harvard/iq/dataverse/search/SolrSearchResultTest.java b/src/test/java/edu/harvard/iq/dataverse/search/SolrSearchResultTest.java index e85084f96ab..967b9bbdd5e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/search/SolrSearchResultTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/search/SolrSearchResultTest.java @@ -4,15 +4,15 @@ import jakarta.json.JsonObject; import jakarta.json.JsonObjectBuilder; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.ArrayList; import java.util.List; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; // **************************************************************************************** // The following tests test the setPublicationStatuses method aiming for 100% prime diff --git a/src/test/java/edu/harvard/iq/dataverse/search/SortByTest.java b/src/test/java/edu/harvard/iq/dataverse/search/SortByTest.java index 956063d4e1f..f2c31f137a2 100644 --- a/src/test/java/edu/harvard/iq/dataverse/search/SortByTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/search/SortByTest.java @@ -1,12 +1,12 @@ package edu.harvard.iq.dataverse.search; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertTrue; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; public class SortByTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/sitemap/SiteMapUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/sitemap/SiteMapUtilTest.java index 4f2b00bbea4..41b13417a23 100644 --- a/src/test/java/edu/harvard/iq/dataverse/sitemap/SiteMapUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/sitemap/SiteMapUtilTest.java @@ -21,10 +21,10 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.Test; import org.xml.sax.SAXException; public class SiteMapUtilTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/userdata/UserListMakerTest.java b/src/test/java/edu/harvard/iq/dataverse/userdata/UserListMakerTest.java index b744db5be20..10c07cf0ef5 100644 --- a/src/test/java/edu/harvard/iq/dataverse/userdata/UserListMakerTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/userdata/UserListMakerTest.java @@ -1,6 +1,6 @@ package edu.harvard.iq.dataverse.userdata; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mock; import org.junit.jupiter.api.AfterEach; diff --git a/src/test/java/edu/harvard/iq/dataverse/util/BitSetTest.java b/src/test/java/edu/harvard/iq/dataverse/util/BitSetTest.java index 5aa37e8b05c..51cd409c3f2 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/BitSetTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/BitSetTest.java @@ -7,12 +7,13 @@ import java.util.Arrays; import java.util.EnumSet; import java.util.List; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/util/BundleUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/util/BundleUtilTest.java index 5be06a5e07b..c7dc13fcaff 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/BundleUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/BundleUtilTest.java @@ -2,11 +2,13 @@ import java.util.Arrays; import java.util.List; -import java.util.Locale; import java.util.MissingResourceException; -import java.util.ResourceBundle; -import org.junit.Test; -import static org.junit.Assert.assertEquals; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; public class BundleUtilTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/util/FileSortFieldAndOrderTest.java b/src/test/java/edu/harvard/iq/dataverse/util/FileSortFieldAndOrderTest.java index 0ad76832952..84a200542fe 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/FileSortFieldAndOrderTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/FileSortFieldAndOrderTest.java @@ -1,8 +1,8 @@ package edu.harvard.iq.dataverse.util; import edu.harvard.iq.dataverse.search.SortBy; -import org.junit.Test; -import static org.junit.Assert.assertEquals; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; public class FileSortFieldAndOrderTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/util/FileUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/util/FileUtilTest.java index 1d481f18cf5..956b54a08ef 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/FileUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/FileUtilTest.java @@ -8,10 +8,6 @@ import edu.harvard.iq.dataverse.FileMetadata; import edu.harvard.iq.dataverse.Guestbook; import edu.harvard.iq.dataverse.TermsOfUseAndAccess; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import edu.harvard.iq.dataverse.*; -import edu.harvard.iq.dataverse.api.UtilIT; import edu.harvard.iq.dataverse.license.License; import edu.harvard.iq.dataverse.util.FileUtil.FileCitationExtension; @@ -19,26 +15,21 @@ import java.io.IOException; import java.time.LocalDate; import java.net.URI; -import java.net.URL; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.Arrays; -import java.util.Collection; import java.util.logging.Level; import java.util.logging.Logger; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.fail; - -import org.junit.Ignore; -import org.junit.Test; -import org.junit.experimental.runners.Enclosed; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameter; -import org.junit.runners.Parameterized.Parameters; - -@RunWith(Enclosed.class) +import java.util.stream.Stream; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + public class FileUtilTest { @RunWith(Parameterized.class) diff --git a/src/test/java/edu/harvard/iq/dataverse/util/FirstNameTest.java b/src/test/java/edu/harvard/iq/dataverse/util/FirstNameTest.java index 972a06ef99e..1925094a2d8 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/FirstNameTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/FirstNameTest.java @@ -1,10 +1,8 @@ package edu.harvard.iq.dataverse.util; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import edu.harvard.iq.dataverse.util.FirstNames; - -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/util/JhoveFileTypeTest.java b/src/test/java/edu/harvard/iq/dataverse/util/JhoveFileTypeTest.java index 88a8d24c772..2a08426ac6c 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/JhoveFileTypeTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/JhoveFileTypeTest.java @@ -5,10 +5,10 @@ import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.io.FileUtils; -import org.junit.AfterClass; -import static org.junit.Assert.assertEquals; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.AfterAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; public class JhoveFileTypeTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/util/JsfHelperTest.java b/src/test/java/edu/harvard/iq/dataverse/util/JsfHelperTest.java index 545d3b1a31f..466edc67b60 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/JsfHelperTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/JsfHelperTest.java @@ -4,19 +4,17 @@ package edu.harvard.iq.dataverse.util; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; -import java.util.Arrays; -import java.util.Collection; +import java.util.stream.Stream; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/util/LruCacheTest.java b/src/test/java/edu/harvard/iq/dataverse/util/LruCacheTest.java index b7ecff4ed8b..f2c2a09d416 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/LruCacheTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/LruCacheTest.java @@ -1,9 +1,10 @@ package edu.harvard.iq.dataverse.util; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/util/MailUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/util/MailUtilTest.java index 76e447b3faa..89b0a7a738b 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/MailUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/MailUtilTest.java @@ -5,7 +5,7 @@ import edu.harvard.iq.dataverse.branding.BrandingUtil; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestMethodOrder; @@ -14,7 +14,7 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; -import org.junit.Before; +import org.junit.jupiter.api.BeforeEach; @ExtendWith(MockitoExtension.class) @TestMethodOrder(OrderAnnotation.class) diff --git a/src/test/java/edu/harvard/iq/dataverse/util/OrganizationsTest.java b/src/test/java/edu/harvard/iq/dataverse/util/OrganizationsTest.java index 3b6cf4a7242..fb6a8e14fcd 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/OrganizationsTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/OrganizationsTest.java @@ -1,10 +1,8 @@ package edu.harvard.iq.dataverse.util; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import edu.harvard.iq.dataverse.util.Organizations; - -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/util/PersonOrOrgUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/util/PersonOrOrgUtilTest.java index 28a999b55b2..f32f6b0873a 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/PersonOrOrgUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/PersonOrOrgUtilTest.java @@ -2,9 +2,9 @@ import edu.harvard.iq.dataverse.util.json.JsonUtil; -import org.junit.Ignore; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; import jakarta.json.JsonObject; diff --git a/src/test/java/edu/harvard/iq/dataverse/util/StringUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/util/StringUtilTest.java index aa2d20362cb..f999b48ea9c 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/StringUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/StringUtilTest.java @@ -1,8 +1,8 @@ package edu.harvard.iq.dataverse.util; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.Arrays; import java.util.Collection; @@ -10,203 +10,89 @@ import java.util.Optional; import java.util.stream.Stream; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.experimental.runners.Enclosed; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.MethodSource; - -/** - * - * @author michael - */ -@RunWith(Enclosed.class) -public class StringUtilTest { - - public StringUtilTest() { - } +class StringUtilTest { - @BeforeClass - public static void setUpClass() { + /** + * Test of isEmpty method, of class StringUtil. + */ + @ParameterizedTest + @CsvSource(value = { + "false, a", + "true, NULL", + "true, ''", + "true, ' '", + "true, \t", + "true, \t \t \n" + }, nullValues = "NULL") + void testIsEmpty(boolean isValid, String inputString) { + assertEquals( isValid, StringUtil.isEmpty(inputString) ); } - @AfterClass - public static void tearDownClass() { + /** + * Test of isAlphaNumeric method, of class StringUtil. + */ + @ParameterizedTest + @CsvSource({ + "true,abc", + "true,1230", + "true,1230abc", + "true,1230abcABC", + "false,1230abcABC#" + }) + void testIsAlphaNumeric(boolean isValid, String inputString) { + assertEquals(isValid, StringUtil.isAlphaNumeric(inputString) ); } - @Before - public void setUp() { + /** + * Test of isAlphaNumericChar method, of class StringUtil. + */ + @ParameterizedTest + @CsvSource({ + "true,'a'", + "true,'f'", + "true,'z'", + "true,'0'", + "true,'1'", + "true,'9'", + "true,'A'", + "true,'G'", + "true,'Z'", + "false,'@'" + }) + void testIsAlphaNumericChar(boolean isValid, char inputChar) { + assertEquals(isValid, StringUtil.isAlphaNumericChar(inputChar) ); } - @After - public void tearDown() { - } - - @RunWith(Parameterized.class) - public static class TestIsEmpty { - - public boolean isValid; - public String inputString; + @ParameterizedTest + @CsvSource(value = { + // interface-based partitioning + "NULL, NULL, NULL", + "NULL, '', NULL", + "NULL, d, NULL", - public TestIsEmpty(boolean isValid, String inputString) { - this.isValid = isValid; - this.inputString = inputString; - } - - @Parameters - public static Collection parameters() { - return Arrays.asList( - new Object[][] { - { true, null }, - { true, "" }, - { true, " " }, - { true, "\t" }, - { true, "\t \t \n" }, - { false, "a" }, - } - ); - } - - /** - * Test of isEmpty method, of class StringUtil. - */ - @Test - public void testIsEmpty() { - assertEquals( isValid, StringUtil.isEmpty(inputString) ); - } - } - - @RunWith(Parameterized.class) - public static class TestIsAlphaNumeric { - - public boolean isValid; - public String inputString; + "'', NULL, ''", + "'', '', ''", + "'', abcdfg, ''", - public TestIsAlphaNumeric(boolean isValid, String inputString) { - this.isValid = isValid; - this.inputString = inputString; - } - - @Parameters - public static Collection parameters() { - return Arrays.asList( - new Object[][] { - { true, "abc" }, - { true, "1230" }, - { true, "1230abc" }, - { true, "1230abcABC" }, - { false, "1230abcABC#" }, - } - ); - } - - /** - * Test of isAlphaNumeric method, of class StringUtil. - */ - @Test - public void testIsAlphaNumeric() { - assertEquals( isValid, StringUtil.isAlphaNumeric(inputString) ); - } - } - - @RunWith(Parameterized.class) - public static class TestIsAlphaNumericChar { - - public boolean isValid; - public char inputChar; - - public TestIsAlphaNumericChar(boolean isValid, char inputChar) { - this.isValid = isValid; - this.inputChar = inputChar; - } - - @Parameters - public static Collection parameters() { - return Arrays.asList( - new Object[][] { - { true, 'a' }, - { true, 'f' }, - { true, 'z' }, - { true, '0' }, - { true, '1' }, - { true, '9' }, - { true, 'A' }, - { true, 'G' }, - { true, 'Z' }, - { false, '@' }, - } - ); - } - - /** - * Test of isAlphaNumericChar method, of class StringUtil. - */ - @Test - public void testIsAlphaNumericChar() { - assertEquals( isValid, StringUtil.isAlphaNumericChar(inputChar) ); - } - } - - @RunWith(Parameterized.class) - public static class TestSubstringIncludingLast { - - public String str; - public String separator; - public String expectedString; + "abcdfg, NULL, ''", + "abcdfg, '', ''", + "abcdfg, d, dfg", - public TestSubstringIncludingLast(String str, String separator, String expectedString) { - this.str = str; - this.separator = separator; - this.expectedString = expectedString; - } - - @Parameters - public static Collection parameters() { - return Arrays.asList( - new Object[][] { - // interface-based partitioning - {null, null, null}, - {null, "", null}, - {null, "d", null}, - - {"", null, ""}, - {"", "", ""}, - {"", "abcdfg", ""}, - - {"abcdfg", null, ""}, - {"abcdfg", "", ""}, - {"abcdfg", "d", "dfg"}, - - // functionality-based partitioning - {"abcdfg" , null, ""}, - {"abcdfg", "h", ""}, - {"abcdfg", "b", "bcdfg"}, - } - ); - } - - @Test - public void testSubstringIncludingLast() { - assertEquals( expectedString, StringUtil.substringIncludingLast(str, separator) ); - } + // functionality-based partitioning + "abcdfg, NULL, ''", + "abcdfg, h, ''", + "abcdfg, b, bcdfg" + }, nullValues = "NULL") + void testSubstringIncludingLast(String str, String separator, String expectedString) { + assertEquals( expectedString, StringUtil.substringIncludingLast(str, separator) ); } - @RunWith(Parameterized.class) - public static class TestToOption { - - public String inputString; - public Optional expected; - - public TestToOption(String inputString, Optional expected) { - this.inputString = inputString; - this.expected = expected; - } - @Parameters public static Collection parameters() { return Arrays.asList( diff --git a/src/test/java/edu/harvard/iq/dataverse/util/UrlSignerUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/util/UrlSignerUtilTest.java index 2b9d507758f..09739b67023 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/UrlSignerUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/UrlSignerUtilTest.java @@ -1,12 +1,12 @@ package edu.harvard.iq.dataverse.util; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.logging.Level; import java.util.logging.Logger; -import org.junit.Test; +import org.junit.jupiter.api.Test; public class UrlSignerUtilTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/util/bagit/BagChecksumTypeTest.java b/src/test/java/edu/harvard/iq/dataverse/util/bagit/BagChecksumTypeTest.java index 2dfaf2b2371..905f8609276 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/bagit/BagChecksumTypeTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/bagit/BagChecksumTypeTest.java @@ -3,7 +3,7 @@ import org.apache.commons.io.IOUtils; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.Map; diff --git a/src/test/java/edu/harvard/iq/dataverse/util/bagit/BagValidationTest.java b/src/test/java/edu/harvard/iq/dataverse/util/bagit/BagValidationTest.java index 4f7a22833e7..87b3382120d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/bagit/BagValidationTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/bagit/BagValidationTest.java @@ -3,7 +3,7 @@ import edu.harvard.iq.dataverse.util.bagit.BagValidation.FileValidationResult; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.nio.file.Path; import java.util.Optional; diff --git a/src/test/java/edu/harvard/iq/dataverse/util/bagit/BagValidatorTest.java b/src/test/java/edu/harvard/iq/dataverse/util/bagit/BagValidatorTest.java index 24c45a8e75c..bb0ea50071d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/bagit/BagValidatorTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/bagit/BagValidatorTest.java @@ -8,8 +8,8 @@ import org.apache.commons.lang3.RandomStringUtils; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; import java.nio.file.Path; diff --git a/src/test/java/edu/harvard/iq/dataverse/util/bagit/FileChecksumValidationJobTest.java b/src/test/java/edu/harvard/iq/dataverse/util/bagit/FileChecksumValidationJobTest.java index 63a2650a5ef..08e853a58df 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/bagit/FileChecksumValidationJobTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/bagit/FileChecksumValidationJobTest.java @@ -5,7 +5,7 @@ import org.apache.commons.io.IOUtils; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.io.IOException; import java.io.InputStream; diff --git a/src/test/java/edu/harvard/iq/dataverse/util/bagit/ManifestReaderTest.java b/src/test/java/edu/harvard/iq/dataverse/util/bagit/ManifestReaderTest.java index e31e2fcc87b..3e84fda92b5 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/bagit/ManifestReaderTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/bagit/ManifestReaderTest.java @@ -5,7 +5,7 @@ import edu.harvard.iq.dataverse.util.bagit.data.FileDataProviderFactory; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; import java.nio.file.Path; diff --git a/src/test/java/edu/harvard/iq/dataverse/util/bagit/data/DataFileDataProviderTest.java b/src/test/java/edu/harvard/iq/dataverse/util/bagit/data/DataFileDataProviderTest.java index 50ebaff2b7c..1d5e20a985e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/bagit/data/DataFileDataProviderTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/bagit/data/DataFileDataProviderTest.java @@ -3,7 +3,7 @@ import edu.harvard.iq.dataverse.DataFile; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; import java.nio.file.Path; diff --git a/src/test/java/edu/harvard/iq/dataverse/util/bagit/data/FileDataProviderFactoryTest.java b/src/test/java/edu/harvard/iq/dataverse/util/bagit/data/FileDataProviderFactoryTest.java index c5eadb09811..f43a0c78284 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/bagit/data/FileDataProviderFactoryTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/bagit/data/FileDataProviderFactoryTest.java @@ -2,7 +2,7 @@ import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.io.IOException; import java.nio.file.Path; diff --git a/src/test/java/edu/harvard/iq/dataverse/util/bagit/data/FolderDataProviderTest.java b/src/test/java/edu/harvard/iq/dataverse/util/bagit/data/FolderDataProviderTest.java index 7e892180bed..e403b32b1b3 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/bagit/data/FolderDataProviderTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/bagit/data/FolderDataProviderTest.java @@ -2,7 +2,7 @@ import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; import java.io.IOException; diff --git a/src/test/java/edu/harvard/iq/dataverse/util/bagit/data/ZipFileDataProviderTest.java b/src/test/java/edu/harvard/iq/dataverse/util/bagit/data/ZipFileDataProviderTest.java index 084fb6ed50f..67bd13d61e4 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/bagit/data/ZipFileDataProviderTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/bagit/data/ZipFileDataProviderTest.java @@ -5,7 +5,7 @@ import org.apache.commons.compress.archivers.zip.ZipFile; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; import java.io.InputStream; diff --git a/src/test/java/edu/harvard/iq/dataverse/util/file/BagItFileHandlerFactoryTest.java b/src/test/java/edu/harvard/iq/dataverse/util/file/BagItFileHandlerFactoryTest.java index d3f1dbcf805..1bff1e08baf 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/file/BagItFileHandlerFactoryTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/file/BagItFileHandlerFactoryTest.java @@ -4,12 +4,12 @@ import edu.harvard.iq.dataverse.util.bagit.BagValidator; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/util/file/BagItFileHandlerPostProcessorTest.java b/src/test/java/edu/harvard/iq/dataverse/util/file/BagItFileHandlerPostProcessorTest.java index f8c7565af7c..064fa8b440f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/file/BagItFileHandlerPostProcessorTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/file/BagItFileHandlerPostProcessorTest.java @@ -5,7 +5,7 @@ import edu.harvard.iq.dataverse.mocks.MocksFactory; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.nio.file.Path; import java.util.ArrayList; diff --git a/src/test/java/edu/harvard/iq/dataverse/util/file/BagItFileHandlerTest.java b/src/test/java/edu/harvard/iq/dataverse/util/file/BagItFileHandlerTest.java index b3687285f6c..7a58a8e04c1 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/file/BagItFileHandlerTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/file/BagItFileHandlerTest.java @@ -14,8 +14,8 @@ import edu.harvard.iq.dataverse.util.bagit.data.StringDataProvider; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; import java.io.File; diff --git a/src/test/java/edu/harvard/iq/dataverse/util/file/CreateDataFileResultTest.java b/src/test/java/edu/harvard/iq/dataverse/util/file/CreateDataFileResultTest.java index 7c392418de9..59d3ac15f11 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/file/CreateDataFileResultTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/file/CreateDataFileResultTest.java @@ -3,7 +3,7 @@ import edu.harvard.iq.dataverse.DataFile; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.Collections; diff --git a/src/test/java/edu/harvard/iq/dataverse/util/json/DatasetVersionDTOTest.java b/src/test/java/edu/harvard/iq/dataverse/util/json/DatasetVersionDTOTest.java index c7077f936a0..08c4a78795a 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/json/DatasetVersionDTOTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/json/DatasetVersionDTOTest.java @@ -17,12 +17,12 @@ import java.util.HashSet; import java.util.List; import java.util.Scanner; -import junit.framework.Assert; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonParserTest.java b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonParserTest.java index 2339d3bf6a7..96437022da8 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonParserTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonParserTest.java @@ -27,10 +27,11 @@ import edu.harvard.iq.dataverse.license.LicenseServiceBean; import edu.harvard.iq.dataverse.mocks.MockDatasetFieldSvc; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Assumptions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; import jakarta.json.Json; @@ -58,9 +59,9 @@ import java.util.Set; import java.util.TimeZone; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * diff --git a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonPrinterTest.java b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonPrinterTest.java index 378158f6ff0..5d7e8eaa50e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonPrinterTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonPrinterTest.java @@ -25,10 +25,11 @@ import jakarta.json.JsonString; import edu.harvard.iq.dataverse.util.BundleUtil; -import org.junit.Test; -import org.junit.Before; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.BeforeEach; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertFalse; diff --git a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonUtilTest.java index 847fbfc9cba..725862db7ba 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonUtilTest.java @@ -1,7 +1,7 @@ package edu.harvard.iq.dataverse.util.json; -import static org.junit.Assert.assertEquals; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; public class JsonUtilTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/util/shapefile/ShapefileHandlerTest.java b/src/test/java/edu/harvard/iq/dataverse/util/shapefile/ShapefileHandlerTest.java index 8aa10c9667f..568cec3a9a9 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/shapefile/ShapefileHandlerTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/shapefile/ShapefileHandlerTest.java @@ -11,16 +11,18 @@ import edu.harvard.iq.dataverse.util.ShapefileHandler; import static edu.harvard.iq.dataverse.util.ShapefileHandler.SHP_XML_EXTENSION; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Arrays; import java.util.List; import java.io.File; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; - -import org.junit.rules.TemporaryFolder; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.FileInputStream; import java.io.FileNotFoundException; diff --git a/src/test/java/edu/harvard/iq/dataverse/util/xml/XmlPrinterTest.java b/src/test/java/edu/harvard/iq/dataverse/util/xml/XmlPrinterTest.java index 8b027b797c5..1a190389ed5 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/xml/XmlPrinterTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/xml/XmlPrinterTest.java @@ -1,7 +1,7 @@ package edu.harvard.iq.dataverse.util.xml; -import org.junit.Test; -import static org.junit.Assert.assertEquals; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; public class XmlPrinterTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/util/xml/XmlValidatorTest.java b/src/test/java/edu/harvard/iq/dataverse/util/xml/XmlValidatorTest.java index dbb87e9e560..6a870a7c3bf 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/xml/XmlValidatorTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/xml/XmlValidatorTest.java @@ -1,20 +1,19 @@ package edu.harvard.iq.dataverse.util.xml; -import edu.harvard.iq.dataverse.NonEssentialTests; - import java.io.FileNotFoundException; import java.io.IOException; import java.net.URL; import javax.xml.parsers.ParserConfigurationException; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.experimental.categories.Category; +import edu.harvard.iq.dataverse.util.testing.Tags; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; import org.xml.sax.SAXException; public class XmlValidatorTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/validation/PasswordValidatorUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/validation/PasswordValidatorUtilTest.java index b574ac4a082..6cec8955215 100644 --- a/src/test/java/edu/harvard/iq/dataverse/validation/PasswordValidatorUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/validation/PasswordValidatorUtilTest.java @@ -5,24 +5,18 @@ */ package edu.harvard.iq.dataverse.validation; -import edu.harvard.iq.dataverse.util.BundleUtil; import edu.harvard.iq.dataverse.util.xml.html.HtmlPrinter; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; import java.util.List; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.experimental.runners.Enclosed; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameter; -import org.junit.runners.Parameterized.Parameters; - -import static org.junit.Assert.*; +import java.util.stream.Stream; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.passay.CharacterRule; import org.passay.EnglishCharacterData; From 955bc36f68922a76c9e18cb4da6a8e917b9f548d Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Fri, 18 Aug 2023 16:57:03 +0200 Subject: [PATCH 083/173] build(test): migrate Before, After and Ignore to JUnit 5 equivalents #9782 --- .../AuxiliaryFileServiceBeanTest.java | 2 +- .../edu/harvard/iq/dataverse/CartTest.java | 4 +-- .../iq/dataverse/DataFileServiceBeanTest.java | 2 +- .../iq/dataverse/DatasetFieldTypeTest.java | 8 +++--- .../dataverse/DatasetFieldValidatorTest.java | 8 +++--- .../edu/harvard/iq/dataverse/DatasetTest.java | 4 +-- .../DatasetVersionServiceBeanTest.java | 4 +-- .../harvard/iq/dataverse/DataverseTest.java | 2 +- .../harvard/iq/dataverse/GlobalIdTest.java | 6 ++-- .../iq/dataverse/PermissionsWrapperTest.java | 4 +-- .../PersistentIdentifierServiceBeanTest.java | 2 +- .../iq/dataverse/RoleAssignmentTest.java | 4 +-- .../actionlogging/ActionLogRecordTest.java | 4 +-- .../iq/dataverse/api/AbstractApiBeanTest.java | 2 +- .../harvard/iq/dataverse/api/AccessIT.java | 4 +-- .../edu/harvard/iq/dataverse/api/AdminIT.java | 4 +-- .../iq/dataverse/api/AuxiliaryFilesIT.java | 2 +- .../edu/harvard/iq/dataverse/api/BagIT.java | 4 +-- .../iq/dataverse/api/BatchImportIT.java | 2 +- .../iq/dataverse/api/BuiltinUsersIT.java | 2 +- .../iq/dataverse/api/ConfirmEmailIT.java | 2 +- .../iq/dataverse/api/DataRetrieverApiIT.java | 2 +- .../harvard/iq/dataverse/api/DatasetsIT.java | 8 +++--- .../iq/dataverse/api/DataversesIT.java | 4 +-- .../iq/dataverse/api/DataversesTest.java | 2 +- .../iq/dataverse/api/DeactivateUsersIT.java | 2 +- .../iq/dataverse/api/DeleteUsersIT.java | 2 +- .../iq/dataverse/api/DownloadFilesIT.java | 2 +- .../api/DownloadInstanceWriterTest.java | 2 +- .../iq/dataverse/api/DuplicateFilesIT.java | 2 +- .../harvard/iq/dataverse/api/EditDDIIT.java | 2 +- .../iq/dataverse/api/ExternalToolsIT.java | 10 +++---- .../iq/dataverse/api/FeedbackApiIT.java | 2 +- .../iq/dataverse/api/FileMetadataIT.java | 8 +++--- .../iq/dataverse/api/FileTypeDetectionIT.java | 2 +- .../edu/harvard/iq/dataverse/api/FilesIT.java | 2 +- .../edu/harvard/iq/dataverse/api/FitsIT.java | 2 +- .../iq/dataverse/api/HarvestingClientsIT.java | 2 +- .../iq/dataverse/api/HarvestingServerIT.java | 4 +-- .../iq/dataverse/api/InReviewWorkflowIT.java | 2 +- .../edu/harvard/iq/dataverse/api/IndexIT.java | 6 ++-- .../iq/dataverse/api/InvalidCharactersIT.java | 2 +- .../harvard/iq/dataverse/api/IpGroupsIT.java | 2 +- .../harvard/iq/dataverse/api/LicensesIT.java | 2 +- .../edu/harvard/iq/dataverse/api/LinkIT.java | 2 +- .../harvard/iq/dataverse/api/LogoutIT.java | 2 +- .../iq/dataverse/api/MakeDataCountApiIT.java | 4 +-- .../harvard/iq/dataverse/api/MetricsIT.java | 4 +-- .../edu/harvard/iq/dataverse/api/MoveIT.java | 2 +- .../harvard/iq/dataverse/api/NetcdfIT.java | 2 +- .../iq/dataverse/api/NotificationsIT.java | 2 +- .../edu/harvard/iq/dataverse/api/PidsIT.java | 10 +++---- .../edu/harvard/iq/dataverse/api/ProvIT.java | 4 +-- .../iq/dataverse/api/RemoteStoreIT.java | 2 +- .../edu/harvard/iq/dataverse/api/RolesIT.java | 2 +- .../harvard/iq/dataverse/api/S3AccessIT.java | 2 +- .../harvard/iq/dataverse/api/SearchIT.java | 6 ++-- .../api/SignedUrlAuthMechanismIT.java | 2 +- .../iq/dataverse/api/SignpostingIT.java | 2 +- .../harvard/iq/dataverse/api/SiteMapIT.java | 2 +- .../iq/dataverse/api/StorageSitesIT.java | 2 +- .../edu/harvard/iq/dataverse/api/SwordIT.java | 4 +-- .../harvard/iq/dataverse/api/TabularIT.java | 22 +++++++-------- .../edu/harvard/iq/dataverse/api/UsersIT.java | 2 +- .../iq/dataverse/api/dto/FieldDTOTest.java | 8 +++--- .../api/filesystem/FileRecordJobIT.java | 28 +++++++++---------- .../impl/ipaddress/ip/IPv6AddressTest.java | 4 +-- .../BuiltinAuthenticationProviderTest.java | 2 +- .../users/AuthenticatedUserTest.java | 2 +- .../confirmemail/ConfirmEmailDataTest.java | 4 +-- .../dataaccess/FileAccessIOTest.java | 4 +-- .../dataaccess/SwiftAccessIOTest.java | 2 +- .../DuplicateFileCheckerTest.java | 4 +-- .../impl/CreateDataverseCommandTest.java | 2 +- .../impl/CreatePrivateUrlCommandTest.java | 2 +- .../command/impl/CreateRoleCommandTest.java | 2 +- .../impl/DeletePrivateUrlCommandTest.java | 2 +- .../impl/GetPrivateUrlCommandTest.java | 8 +++--- .../impl/ListMetadataBlocksCommandTest.java | 2 +- .../command/impl/MoveDatasetCommandTest.java | 2 +- .../impl/MoveDataverseCommandTest.java | 2 +- .../impl/RequestRsyncScriptCommandTest.java | 8 +++--- .../command/impl/RestrictFileCommandTest.java | 10 +++---- .../ReturnDatasetToAuthorCommandTest.java | 2 +- .../SubmitDatasetForReviewCommandTest.java | 2 +- .../UpdateDatasetThumbnailCommandTest.java | 8 +++--- ...dateMetadataBlockFacetRootCommandTest.java | 2 +- .../UpdateMetadataBlockFacetsCommandTest.java | 2 +- .../impl/UpdatePermissionRootCommandTest.java | 2 +- .../dataverse/feedback/FeedbackUtilTest.java | 2 +- .../ingest/IngestableDataCheckerTest.java | 8 +++--- .../plugins/dta/NewDTAFileReaderTest.java | 8 +++--- .../passwordreset/PasswordResetDataTest.java | 8 +++--- .../dataverse/pidproviders/PidUtilTest.java | 5 ++-- .../provenance/ProvInvestigatorTest.java | 2 +- .../iq/dataverse/search/IndexUtilTest.java | 8 +++--- .../search/SolrSearchResultTest.java | 4 +-- .../iq/dataverse/search/SortByTest.java | 4 +-- .../harvard/iq/dataverse/util/BitSetTest.java | 8 +++--- .../iq/dataverse/util/JhoveFileTypeTest.java | 4 +-- .../iq/dataverse/util/JsfHelperTest.java | 8 +++--- .../iq/dataverse/util/LruCacheTest.java | 4 +-- .../iq/dataverse/util/MailUtilTest.java | 2 +- .../dataverse/util/PersonOrOrgUtilTest.java | 2 +- .../util/bagit/BagValidatorTest.java | 2 +- .../util/file/BagItFileHandlerTest.java | 2 +- .../util/json/DatasetVersionDTOTest.java | 8 +++--- .../dataverse/util/json/JsonParserTest.java | 6 ++-- .../dataverse/util/json/JsonPrinterTest.java | 2 +- 109 files changed, 222 insertions(+), 221 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/AuxiliaryFileServiceBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/AuxiliaryFileServiceBeanTest.java index 31d7793eac9..30bd260eb1b 100644 --- a/src/test/java/edu/harvard/iq/dataverse/AuxiliaryFileServiceBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/AuxiliaryFileServiceBeanTest.java @@ -24,7 +24,7 @@ public class AuxiliaryFileServiceBeanTest { List types; DataFile dataFile; - @Before + @BeforeEach public void setup() { svc = new AuxiliaryFileServiceBean(); svc.em = mock(EntityManager.class); diff --git a/src/test/java/edu/harvard/iq/dataverse/CartTest.java b/src/test/java/edu/harvard/iq/dataverse/CartTest.java index 6b44c830ca6..e847cfb3346 100644 --- a/src/test/java/edu/harvard/iq/dataverse/CartTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/CartTest.java @@ -17,14 +17,14 @@ public class CartTest { private String title; private String persistentId; - @Before + @BeforeEach public void setUp() { this.cart = new Cart(); this.title = "title"; this.persistentId = "persistentId"; } - @After + @AfterEach public void tearDwon() { this.cart = null; this.title = null; diff --git a/src/test/java/edu/harvard/iq/dataverse/DataFileServiceBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/DataFileServiceBeanTest.java index 269668b19d7..ab3d0f8ef55 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DataFileServiceBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DataFileServiceBeanTest.java @@ -28,7 +28,7 @@ public DataFileServiceBeanTest() { private DataFileServiceBean dataFileServiceBean; - @Before + @BeforeEach public void setUp() { fileWoContentType = createDataFile(null); fileWithBogusContentType = createDataFile("foo/bar"); diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldTypeTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldTypeTest.java index ca734eb8635..a235c9b0061 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldTypeTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldTypeTest.java @@ -23,19 +23,19 @@ public class DatasetFieldTypeTest { public DatasetFieldTypeTest() { } - @BeforeClass + @BeforeAll public static void setUpClass() { } - @AfterClass + @AfterAll public static void tearDownClass() { } - @Before + @BeforeEach public void setUp() { } - @After + @AfterEach public void tearDown() { } diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldValidatorTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldValidatorTest.java index db60e9b1edd..e9296b431dc 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldValidatorTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldValidatorTest.java @@ -26,19 +26,19 @@ public class DatasetFieldValidatorTest { public DatasetFieldValidatorTest() { } - @BeforeClass + @BeforeAll public static void setUpClass() { } - @AfterClass + @AfterAll public static void tearDownClass() { } - @Before + @BeforeEach public void setUp() { } - @After + @AfterEach public void tearDown() { } diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetTest.java index 30d8d0867a0..cd5186e6a87 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetTest.java @@ -79,7 +79,7 @@ public void testLocksManagement() { private DatasetVersion draftVersion; private DatasetVersion releasedVersion; - @Before + @BeforeEach public void before() { this.archivedVersion = new DatasetVersion(); this.archivedVersion.setVersionState(VersionState.ARCHIVED); @@ -94,7 +94,7 @@ public void before() { this.releasedVersion.setVersionState(VersionState.RELEASED); } - @After + @AfterEach public void after() { this.archivedVersion = null; this.deaccessionedVersion = null; diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetVersionServiceBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetVersionServiceBeanTest.java index ef15372c408..424ff54fe02 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetVersionServiceBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetVersionServiceBeanTest.java @@ -18,13 +18,13 @@ public class DatasetVersionServiceBeanTest { private DatasetVersionServiceBean datasetVersionServiceBean; - @Before + @BeforeEach public void setUp() { this.datasetVersionServiceBean = new DatasetVersionServiceBean(); } - @After + @AfterEach public void tearDown() { this.datasetVersionServiceBean = null; } diff --git a/src/test/java/edu/harvard/iq/dataverse/DataverseTest.java b/src/test/java/edu/harvard/iq/dataverse/DataverseTest.java index 35db6c29e89..4e2bd5b3c2d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DataverseTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DataverseTest.java @@ -18,7 +18,7 @@ public class DataverseTest { private Dataverse OWNER; private List OWNER_METADATABLOCKFACETS; - @Before + @BeforeEach public void beforeEachTest() { OWNER = new Dataverse(); OWNER.setId(MocksFactory.nextId()); diff --git a/src/test/java/edu/harvard/iq/dataverse/GlobalIdTest.java b/src/test/java/edu/harvard/iq/dataverse/GlobalIdTest.java index 3c3993d110d..7a615b15345 100644 --- a/src/test/java/edu/harvard/iq/dataverse/GlobalIdTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/GlobalIdTest.java @@ -69,7 +69,7 @@ public void testInject() { } @Test - @Ignore /* Could now add a 'doy' protocol so the test would have to check against registered PIDProviders (currently Beans)*/ + @Disabled /* Could now add a 'doy' protocol so the test would have to check against registered PIDProviders (currently Beans)*/ public void testUnknownProtocol() { System.out.println("testUnknownProtocol"); @@ -81,7 +81,7 @@ public void testUnknownProtocol() { } @Test - @Ignore /* Could now change parsing rules so the test would have to check against registered PIDProviders (currently Beans)*/ + @Disabled /* Could now change parsing rules so the test would have to check against registered PIDProviders (currently Beans)*/ public void testBadIdentifierOnePart() { System.out.println("testBadIdentifierOnePart"); @@ -91,7 +91,7 @@ public void testBadIdentifierOnePart() { } @Test - @Ignore /* Could now change parsing rules so the test would have to check against registered PIDProviders (currently Beans)*/ + @Disabled /* Could now change parsing rules so the test would have to check against registered PIDProviders (currently Beans)*/ public void testBadIdentifierTwoParts() { System.out.println("testBadIdentifierTwoParts"); diff --git a/src/test/java/edu/harvard/iq/dataverse/PermissionsWrapperTest.java b/src/test/java/edu/harvard/iq/dataverse/PermissionsWrapperTest.java index 0acd7a8dca9..751a90fb447 100644 --- a/src/test/java/edu/harvard/iq/dataverse/PermissionsWrapperTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/PermissionsWrapperTest.java @@ -19,14 +19,14 @@ public class PermissionsWrapperTest { private PermissionsWrapper permissionWrapper; - @Before + @BeforeEach public void setUp() { this.permissionWrapper = new PermissionsWrapper(); this.permissionWrapper.permissionService = mock(PermissionServiceBean.class); this.permissionWrapper.dvRequestService = mock(DataverseRequestServiceBean.class); } - @After + @AfterEach public void tearDown() { this.permissionWrapper = null; } diff --git a/src/test/java/edu/harvard/iq/dataverse/PersistentIdentifierServiceBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/PersistentIdentifierServiceBeanTest.java index 2e943bc7647..dcd0f583d9f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/PersistentIdentifierServiceBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/PersistentIdentifierServiceBeanTest.java @@ -43,7 +43,7 @@ public class PersistentIdentifierServiceBeanTest { CommandContext ctxt; - @Before + @BeforeEach public void setup() { MockitoAnnotations.initMocks(this); ctxt = new TestCommandContext(){ diff --git a/src/test/java/edu/harvard/iq/dataverse/RoleAssignmentTest.java b/src/test/java/edu/harvard/iq/dataverse/RoleAssignmentTest.java index 6ed5e8c55bc..f8138537cd7 100644 --- a/src/test/java/edu/harvard/iq/dataverse/RoleAssignmentTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/RoleAssignmentTest.java @@ -22,7 +22,7 @@ public class RoleAssignmentTest { private Dataset dataset; private String privateUrlToken; - @Before + @BeforeEach public void before() { this.dataverseRole = new DataverseRole(); this.roleAssignee = GuestUser.get(); @@ -30,7 +30,7 @@ public void before() { this.privateUrlToken = "some-token"; } - @After + @AfterEach public void after() { this.dataverseRole = null; this.roleAssignee = null; diff --git a/src/test/java/edu/harvard/iq/dataverse/actionlogging/ActionLogRecordTest.java b/src/test/java/edu/harvard/iq/dataverse/actionlogging/ActionLogRecordTest.java index 9641fe57fb6..6a965b17a16 100644 --- a/src/test/java/edu/harvard/iq/dataverse/actionlogging/ActionLogRecordTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/actionlogging/ActionLogRecordTest.java @@ -16,7 +16,7 @@ public class ActionLogRecordTest { private ActionLogRecord referenceRecord; - @Before + @BeforeEach public void setUp() { this.referenceRecord = new ActionLogRecord(ActionType.Admin, "subType1"); this.referenceRecord.setEndTime(new Date()); @@ -25,7 +25,7 @@ public void setUp() { this.referenceRecord.setInfo("info1"); } - @After + @AfterEach public void tearDwon() { this.referenceRecord = null; } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/AbstractApiBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/api/AbstractApiBeanTest.java index 89f2ade1e72..860eeb47f4f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/AbstractApiBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/AbstractApiBeanTest.java @@ -24,7 +24,7 @@ public class AbstractApiBeanTest { AbstractApiBeanImpl sut; - @Before + @BeforeEach public void before() { sut = new AbstractApiBeanImpl(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/AccessIT.java b/src/test/java/edu/harvard/iq/dataverse/api/AccessIT.java index 0f83e1a6de8..c3a0de04c8d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/AccessIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/AccessIT.java @@ -82,7 +82,7 @@ public class AccessIT { private static String testFileFromZipUploadWithFoldersChecksum3 = "00433ccb20111f9d40f0e5ab6fa8396f"; - @BeforeClass + @BeforeAll public static void setUp() throws InterruptedException { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); @@ -162,7 +162,7 @@ public static void setUp() throws InterruptedException { } - @AfterClass + @AfterAll public static void tearDown() { Response publishDataset = UtilIT.publishDatasetViaNativeApi(datasetId, "major", apiToken); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/AdminIT.java b/src/test/java/edu/harvard/iq/dataverse/api/AdminIT.java index cf7e43268ba..7f3a6d70252 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/AdminIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/AdminIT.java @@ -41,7 +41,7 @@ public class AdminIT { private final String testNonSuperuserApiToken = createTestNonSuperuserApiToken(); - @BeforeClass + @BeforeAll public static void setUp() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } @@ -670,7 +670,7 @@ public void testRecalculateDataFileHash() { } @Test - @Ignore + @Disabled public void testMigrateHDLToDOI() { /* This test is set to ignore because it requires a setup that will diff --git a/src/test/java/edu/harvard/iq/dataverse/api/AuxiliaryFilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/AuxiliaryFilesIT.java index a5251de43f4..506a1186194 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/AuxiliaryFilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/AuxiliaryFilesIT.java @@ -20,7 +20,7 @@ public class AuxiliaryFilesIT { - @BeforeClass + @BeforeAll public static void setUp() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/BagIT.java b/src/test/java/edu/harvard/iq/dataverse/api/BagIT.java index 2fbd1ef8049..80cbedac365 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/BagIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/BagIT.java @@ -12,7 +12,7 @@ public class BagIT { - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); @@ -65,7 +65,7 @@ public void testBagItExport() { } - @AfterClass + @AfterAll public static void tearDownClass() { // Not checking if delete happened. Hopefully, it did. diff --git a/src/test/java/edu/harvard/iq/dataverse/api/BatchImportIT.java b/src/test/java/edu/harvard/iq/dataverse/api/BatchImportIT.java index db13aace0e1..045dae2b313 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/BatchImportIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/BatchImportIT.java @@ -21,7 +21,7 @@ public class BatchImportIT { public BatchImportIT() { } - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/BuiltinUsersIT.java b/src/test/java/edu/harvard/iq/dataverse/api/BuiltinUsersIT.java index 5bc7be3d299..5260eead76a 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/BuiltinUsersIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/BuiltinUsersIT.java @@ -36,7 +36,7 @@ public class BuiltinUsersIT { private static final String usernameKey = "userName"; private static final String emailKey = "email"; - @BeforeClass + @BeforeAll public static void setUp() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/ConfirmEmailIT.java b/src/test/java/edu/harvard/iq/dataverse/api/ConfirmEmailIT.java index 3db1f6d2d22..01369680536 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/ConfirmEmailIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/ConfirmEmailIT.java @@ -18,7 +18,7 @@ public class ConfirmEmailIT { private static final Logger logger = Logger.getLogger(ConfirmEmailIT.class.getCanonicalName()); - @BeforeClass + @BeforeAll public static void setUp() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java index f15a1b8e7ee..f58e2007eb1 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java @@ -15,7 +15,7 @@ public class DataRetrieverApiIT { - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java index 1419784d5fd..44965c27a3d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java @@ -99,7 +99,7 @@ public class DatasetsIT { - @BeforeClass + @BeforeAll public static void setUpClass() { @@ -129,7 +129,7 @@ public static void setUpClass() { */ } - @AfterClass + @AfterAll public static void afterClass() { Response removeIdentifierGenerationStyle = UtilIT.deleteSetting(SettingsServiceBean.Key.IdentifierGenerationStyle); @@ -1852,7 +1852,7 @@ public void testCreateDeleteDatasetLink() { } @Test - @Ignore + @Disabled public void testApiErrors() { /* @@ -2061,7 +2061,7 @@ public void testDatasetLocksApi() { * This test requires the root dataverse to be published to pass. */ @Test - @Ignore + @Disabled public void testUpdatePIDMetadataAPI() { Response createUser = UtilIT.createRandomUser(); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java index 0a5a773853e..3bb929e0aa7 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java @@ -40,12 +40,12 @@ public class DataversesIT { private static final Logger logger = Logger.getLogger(DataversesIT.class.getCanonicalName()); - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } - @AfterClass + @AfterAll public static void afterClass() { Response removeExcludeEmail = UtilIT.deleteSetting(SettingsServiceBean.Key.ExcludeEmailFromExport); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DataversesTest.java b/src/test/java/edu/harvard/iq/dataverse/api/DataversesTest.java index 3733f87255c..a2f5c3335ee 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DataversesTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DataversesTest.java @@ -79,7 +79,7 @@ public class DataversesTest { private Dataverse VALID_DATAVERSE; - @Before + @BeforeEach public void beforeEachTest() { VALID_DATAVERSE = new Dataverse(); VALID_DATAVERSE.setId(MocksFactory.nextId()); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DeactivateUsersIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DeactivateUsersIT.java index 2af2335b9c7..d3feb3dad7a 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DeactivateUsersIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DeactivateUsersIT.java @@ -19,7 +19,7 @@ public class DeactivateUsersIT { - @BeforeClass + @BeforeAll public static void setUp() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DeleteUsersIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DeleteUsersIT.java index 926ae5d5d8d..7be43103acc 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DeleteUsersIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DeleteUsersIT.java @@ -130,7 +130,7 @@ */ public class DeleteUsersIT { - @BeforeClass + @BeforeAll public static void setUp() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DownloadFilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DownloadFilesIT.java index 44910d7be29..7fcf7489d1d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DownloadFilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DownloadFilesIT.java @@ -29,7 +29,7 @@ public class DownloadFilesIT { - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DownloadInstanceWriterTest.java b/src/test/java/edu/harvard/iq/dataverse/api/DownloadInstanceWriterTest.java index 229c7166835..f7f61d18a51 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DownloadInstanceWriterTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DownloadInstanceWriterTest.java @@ -11,7 +11,7 @@ public class DownloadInstanceWriterTest { DownloadInstanceWriter diw; - @Before + @BeforeEach public void setUpClass() { diw = new DownloadInstanceWriter(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DuplicateFilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DuplicateFilesIT.java index 1516c0c7fc0..3c0ef73f6df 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DuplicateFilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DuplicateFilesIT.java @@ -25,7 +25,7 @@ */ public class DuplicateFilesIT { - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/EditDDIIT.java b/src/test/java/edu/harvard/iq/dataverse/api/EditDDIIT.java index 8dfe36099c6..d443b22442f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/EditDDIIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/EditDDIIT.java @@ -40,7 +40,7 @@ public class EditDDIIT { private static final Logger logger = Logger.getLogger(EditDDIIT.class.getCanonicalName()); - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/ExternalToolsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/ExternalToolsIT.java index ddd1f059fac..3244dffd8a8 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/ExternalToolsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/ExternalToolsIT.java @@ -25,7 +25,7 @@ public class ExternalToolsIT { - @BeforeClass + @BeforeAll public static void setUp() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } @@ -309,7 +309,7 @@ public void testAddExternalToolNonReservedWord() throws IOException { .statusCode(BAD_REQUEST.getStatusCode()); } - @Ignore + @Disabled @Test public void deleteTools() { @@ -330,7 +330,7 @@ public void deleteTools() { } // preview only - @Ignore + @Disabled @Test public void createToolShellScript() { JsonObjectBuilder job = Json.createObjectBuilder(); @@ -370,7 +370,7 @@ public void createToolShellScript() { } // explore only - @Ignore + @Disabled @Test public void createToolDataExplorer() { JsonObjectBuilder job = Json.createObjectBuilder(); @@ -403,7 +403,7 @@ public void createToolDataExplorer() { } // both preview and explore - @Ignore + @Disabled @Test public void createToolSpreadsheetViewer() { JsonObjectBuilder job = Json.createObjectBuilder(); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FeedbackApiIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FeedbackApiIT.java index 5e21abc6b09..bab610cda8f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FeedbackApiIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FeedbackApiIT.java @@ -13,7 +13,7 @@ public class FeedbackApiIT { - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FileMetadataIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FileMetadataIT.java index ebc24d0b23f..8c87440b488 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FileMetadataIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FileMetadataIT.java @@ -33,12 +33,12 @@ public class FileMetadataIT { private static int dsId; private static int dsIdFirst; - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } - @Before + @BeforeEach public void setUpDataverse() { try { // create random test name @@ -85,12 +85,12 @@ public void setUpDataverse() { } } - @AfterClass + @AfterAll public static void tearDownClass() { RestAssured.reset(); } - @After + @AfterEach public void tearDownDataverse() { try { // delete dataset diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FileTypeDetectionIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FileTypeDetectionIT.java index dcb0c19eab3..0012f50e29d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FileTypeDetectionIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FileTypeDetectionIT.java @@ -15,7 +15,7 @@ public class FileTypeDetectionIT { - @BeforeClass + @BeforeAll public static void setUp() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java index ca4597a3680..3463e99412b 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java @@ -44,7 +44,7 @@ public class FilesIT { private static final Logger logger = Logger.getLogger(FilesIT.class.getCanonicalName()); - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FitsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FitsIT.java index da9b5b5ccc5..b956fb5bd4c 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FitsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FitsIT.java @@ -17,7 +17,7 @@ public class FitsIT { - @BeforeClass + @BeforeAll public static void setUp() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/HarvestingClientsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/HarvestingClientsIT.java index bb5b833f6b9..9c9022a95dd 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/HarvestingClientsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/HarvestingClientsIT.java @@ -41,7 +41,7 @@ public class HarvestingClientsIT { private static String adminUserAPIKey; private static String harvestCollectionAlias; - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/HarvestingServerIT.java b/src/test/java/edu/harvard/iq/dataverse/api/HarvestingServerIT.java index 3004d0ef1d2..174f6a63da7 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/HarvestingServerIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/HarvestingServerIT.java @@ -41,7 +41,7 @@ public class HarvestingServerIT { private static String singleSetDatasetPersistentId; private static List extraDatasetsIdentifiers = new ArrayList<>(); - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); // enable harvesting server @@ -56,7 +56,7 @@ public static void setUpClass() { } - @AfterClass + @AfterAll public static void afterClass() { // disable harvesting server (default value) Response enableHarvestingServerResponse = UtilIT.setSetting(SettingsServiceBean.Key.OAIServerEnabled,"false"); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/InReviewWorkflowIT.java b/src/test/java/edu/harvard/iq/dataverse/api/InReviewWorkflowIT.java index f88bddb5159..f50743b582f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/InReviewWorkflowIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/InReviewWorkflowIT.java @@ -23,7 +23,7 @@ public class InReviewWorkflowIT { private static final Logger logger = Logger.getLogger(DatasetsIT.class.getCanonicalName()); - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/IndexIT.java b/src/test/java/edu/harvard/iq/dataverse/api/IndexIT.java index 91260f61e69..4d6beb30ec8 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/IndexIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/IndexIT.java @@ -23,7 +23,7 @@ public class IndexIT { private static final Logger logger = Logger.getLogger(IndexIT.class.getCanonicalName()); - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); @@ -100,11 +100,11 @@ public void testIndexStatus() { } - @After + @AfterEach public void tearDownDataverse() { } - @AfterClass + @AfterAll public static void cleanup() { } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/InvalidCharactersIT.java b/src/test/java/edu/harvard/iq/dataverse/api/InvalidCharactersIT.java index 3d58ecdd739..24450134583 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/InvalidCharactersIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/InvalidCharactersIT.java @@ -16,7 +16,7 @@ public class InvalidCharactersIT { - @BeforeClass + @BeforeAll public static void setUp() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/IpGroupsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/IpGroupsIT.java index 40f342af987..0df0cf59bdd 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/IpGroupsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/IpGroupsIT.java @@ -21,7 +21,7 @@ public class IpGroupsIT { private static final Logger logger = Logger.getLogger(IpGroupsIT.class.getCanonicalName()); - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/LicensesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/LicensesIT.java index b29e6472fcf..7f7c68db792 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/LicensesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/LicensesIT.java @@ -18,7 +18,7 @@ public class LicensesIT { private static final Logger logger = Logger.getLogger(LicensesIT.class.getCanonicalName()); - @BeforeClass + @BeforeAll public static void setUp() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java b/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java index 8a440da2ace..d9f42b36096 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java @@ -16,7 +16,7 @@ public class LinkIT { private static final Logger logger = Logger.getLogger(LinkIT.class.getCanonicalName()); - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/LogoutIT.java b/src/test/java/edu/harvard/iq/dataverse/api/LogoutIT.java index f4b60369443..a9332a5d394 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/LogoutIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/LogoutIT.java @@ -10,7 +10,7 @@ public class LogoutIT { - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/MakeDataCountApiIT.java b/src/test/java/edu/harvard/iq/dataverse/api/MakeDataCountApiIT.java index 107ecece1d7..d4ff45f3b12 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/MakeDataCountApiIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/MakeDataCountApiIT.java @@ -15,7 +15,7 @@ public class MakeDataCountApiIT { - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } @@ -181,7 +181,7 @@ public void testMakeDataCountGetMetric() throws IOException { * * update dvobject set authority = '10.7910' where id = 10; */ - @Ignore + @Disabled @Test public void testMakeDataCountDownloadCitation() { String idOrPersistentIdOfDataset = "doi:10.7910/DVN/HQZOOB"; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/MetricsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/MetricsIT.java index 72e73547979..61eb788b57e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/MetricsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/MetricsIT.java @@ -17,13 +17,13 @@ //go up to show that the caching worked public class MetricsIT { - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); UtilIT.clearMetricCache(); } - @AfterClass + @AfterAll public static void cleanUpClass() { UtilIT.clearMetricCache(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/MoveIT.java b/src/test/java/edu/harvard/iq/dataverse/api/MoveIT.java index 5f9d2f7374b..229e7fa646d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/MoveIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/MoveIT.java @@ -25,7 +25,7 @@ public class MoveIT { private static final Logger logger = Logger.getLogger(MoveIT.class.getCanonicalName()); - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/NetcdfIT.java b/src/test/java/edu/harvard/iq/dataverse/api/NetcdfIT.java index dd39cc3549d..6fa69118bba 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/NetcdfIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/NetcdfIT.java @@ -19,7 +19,7 @@ public class NetcdfIT { - @BeforeClass + @BeforeAll public static void setUp() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/NotificationsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/NotificationsIT.java index 683acf7c541..07e942943c5 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/NotificationsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/NotificationsIT.java @@ -14,7 +14,7 @@ public class NotificationsIT { private static final Logger logger = Logger.getLogger(NotificationsIT.class.getCanonicalName()); - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/PidsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/PidsIT.java index cc9fe2dd4b3..39c5b3ed2f0 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/PidsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/PidsIT.java @@ -16,12 +16,12 @@ */ public class PidsIT { - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } - @Ignore + @Disabled @Test public void testGetPid() { String pid = ""; @@ -94,7 +94,7 @@ public void testReservePid() { */ } - @Ignore + @Disabled @Test public void testDeletePid() { String pid = ""; @@ -112,7 +112,7 @@ public void testDeletePid() { deletePid.prettyPrint(); } - @Ignore + @Disabled @Test public void testCannotPublishUntilReserved() { Response createUser = UtilIT.createRandomUser(); @@ -154,7 +154,7 @@ public void testCannotPublishUntilReserved() { .statusCode(FORBIDDEN.getStatusCode()); } - @Ignore + @Disabled @Test public void testDeleteDraftPidOnDelete() { Response createUser = UtilIT.createRandomUser(); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/ProvIT.java b/src/test/java/edu/harvard/iq/dataverse/api/ProvIT.java index ddd523bf553..5e663e40779 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/ProvIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/ProvIT.java @@ -19,13 +19,13 @@ public class ProvIT { - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } - @Test + @Test public void testFreeformDraftActions() { Response createDepositor = UtilIT.createRandomUser(); createDepositor.prettyPrint(); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/RemoteStoreIT.java b/src/test/java/edu/harvard/iq/dataverse/api/RemoteStoreIT.java index 48b52d1c892..f0c07f2f275 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/RemoteStoreIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/RemoteStoreIT.java @@ -11,7 +11,7 @@ public class RemoteStoreIT { - @BeforeClass + @BeforeAll public static void setUp() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/RolesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/RolesIT.java index 6168ff27c4d..cfff9acb487 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/RolesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/RolesIT.java @@ -20,7 +20,7 @@ public class RolesIT { private static final Logger logger = Logger.getLogger(AdminIT.class.getCanonicalName()); - @BeforeClass + @BeforeAll public static void setUp() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/S3AccessIT.java b/src/test/java/edu/harvard/iq/dataverse/api/S3AccessIT.java index acc47db360a..e4b036b88d9 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/S3AccessIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/S3AccessIT.java @@ -20,7 +20,7 @@ public class S3AccessIT { private static final Logger logger = Logger.getLogger(S3AccessIT.class.getCanonicalName()); - @BeforeClass + @BeforeAll public static void setUp() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java b/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java index 2f67f07d2dc..18c3b3a318e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java @@ -43,7 +43,7 @@ public class SearchIT { private static final Logger logger = Logger.getLogger(SearchIT.class.getCanonicalName()); - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); @@ -1282,7 +1282,7 @@ public void testGeospatialSearchInvalid() { } - @After + @AfterEach public void tearDownDataverse() { File treesThumb = new File("scripts/search/data/binary/trees.png.thumb48"); treesThumb.delete(); @@ -1292,7 +1292,7 @@ public void tearDownDataverse() { dataverseprojectThumb.delete(); } - @AfterClass + @AfterAll public static void cleanup() { } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/SignedUrlAuthMechanismIT.java b/src/test/java/edu/harvard/iq/dataverse/api/SignedUrlAuthMechanismIT.java index ab153ad59bb..cb797af55fb 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/SignedUrlAuthMechanismIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/SignedUrlAuthMechanismIT.java @@ -12,7 +12,7 @@ public class SignedUrlAuthMechanismIT { - @BeforeClass + @BeforeAll public static void setUp() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/SignpostingIT.java b/src/test/java/edu/harvard/iq/dataverse/api/SignpostingIT.java index 6e24bad0e01..3b450ad98ca 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/SignpostingIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/SignpostingIT.java @@ -22,7 +22,7 @@ public class SignpostingIT { - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/SiteMapIT.java b/src/test/java/edu/harvard/iq/dataverse/api/SiteMapIT.java index 048bc1c2df5..0df8631581e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/SiteMapIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/SiteMapIT.java @@ -7,7 +7,7 @@ public class SiteMapIT { - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/StorageSitesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/StorageSitesIT.java index 13b1f36d59a..2eaf78e8495 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/StorageSitesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/StorageSitesIT.java @@ -11,7 +11,7 @@ public class StorageSitesIT { - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/SwordIT.java b/src/test/java/edu/harvard/iq/dataverse/api/SwordIT.java index 812fa7897f7..686670d8b3e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/SwordIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/SwordIT.java @@ -55,7 +55,7 @@ public class SwordIT { private static final String rootDvNotPublished = "Many of these SWORD tests require that the root dataverse collection has been published. Publish the root dataverse and then re-run these tests."; private static final String rootDvLackPermissions = "Many of these SWORD tests require you set permissions for the root dataverse collection: \"Anyone with a Dataverse account can add sub dataverses and datasets\" + curator role for new datasets. Please set and re-run these tests."; - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); boolean testAgainstDev1 = false; @@ -968,7 +968,7 @@ public void testDeleteFiles() { } - @AfterClass + @AfterAll public static void tearDownClass() { // cleanup, allow custom terms again (delete because it defaults to true) UtilIT.deleteSetting(SettingsServiceBean.Key.AllowCustomTermsOfUse); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/TabularIT.java b/src/test/java/edu/harvard/iq/dataverse/api/TabularIT.java index 4afd5058a3a..1a5e3a7e7f0 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/TabularIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/TabularIT.java @@ -20,12 +20,12 @@ public class TabularIT { private static final Logger logger = Logger.getLogger(TabularIT.class.getCanonicalName()); - @BeforeClass + @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); } - @Ignore + @Disabled @Test public void testTabularFile() throws InterruptedException { Response createUser = UtilIT.createRandomUser(); @@ -100,7 +100,7 @@ public void testTabularFile() throws InterruptedException { } - @Ignore + @Disabled @Test public void test50by1000() { // cp scripts/search/data/tabular/50by1000.dta /tmp @@ -111,7 +111,7 @@ public void test50by1000() { assertEquals("NVARS: 50", response.body().asString().split("\n")[0]); } - @Ignore + @Disabled @Test public void testStata13TinyFile() { // cp scripts/search/data/tabular/120745.dta /tmp @@ -122,7 +122,7 @@ public void testStata13TinyFile() { assertEquals("NVARS: 1", response.body().asString().split("\n")[0]); } - @Ignore + @Disabled @Test public void testStata13Auto() { // curl https://www.stata-press.com/data/r13/auto.dta > /tmp/stata13-auto.dta @@ -133,7 +133,7 @@ public void testStata13Auto() { assertEquals("NVARS: 12", response.body().asString().split("\n")[0]); } - @Ignore + @Disabled @Test public void testStata14OpenSourceAtHarvard() { // https://dataverse.harvard.edu/file.xhtml?fileId=3040230 converted to Stata 14: 2017-07-31.tab @@ -146,7 +146,7 @@ public void testStata14OpenSourceAtHarvard() { assertEquals("NVARS: 10", response.body().asString().split("\n")[0]); } - @Ignore + @Disabled @Test public void testStata14Aggregated() { // https://dataverse.harvard.edu/file.xhtml?fileId=3140457 Stata 14: 2018_04_06_Aggregated_dataset_v2.dta @@ -158,7 +158,7 @@ public void testStata14Aggregated() { assertEquals("NVARS: 227", response.body().asString().split("\n")[0]); } - @Ignore + @Disabled @Test public void testStata14MmPublic() { // TODO: This file was downloaded at random. We could keep trying to get it to ingest. @@ -173,7 +173,7 @@ public void testStata14MmPublic() { assertEquals("NVARS: 12", response.body().asString().split("\n")[0]); } - @Ignore + @Disabled @Test public void testStata15() { // for i in `echo {0..33000}`; do echo -n "var$i,"; done > 33k.csv @@ -185,7 +185,7 @@ public void testStata15() { assertEquals("NVARS: 33001", response.body().asString().split("\n")[0]); } - @Ignore + @Disabled @Test public void testStata13Multiple() { String fileType = "application/x-stata-13"; @@ -205,7 +205,7 @@ public void testStata13Multiple() { } } - @Ignore + @Disabled @Test public void testStata14Multiple() { String fileType = "application/x-stata-14"; diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java index 1dd1199ebd6..be1ea5b9fd6 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java @@ -27,7 +27,7 @@ public class UsersIT { - @BeforeClass + @BeforeAll public static void setUp() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); /* diff --git a/src/test/java/edu/harvard/iq/dataverse/api/dto/FieldDTOTest.java b/src/test/java/edu/harvard/iq/dataverse/api/dto/FieldDTOTest.java index 21e37625543..4f75669eb05 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/dto/FieldDTOTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/dto/FieldDTOTest.java @@ -27,15 +27,15 @@ public class FieldDTOTest { public FieldDTOTest() { } - @BeforeClass + @BeforeAll public static void setUpClass() { } - @AfterClass + @AfterAll public static void tearDownClass() { } - @Before + @BeforeEach public void setUp() { Set authorFields = new HashSet<>(); @@ -49,7 +49,7 @@ public void setUp() { } - @After + @AfterEach public void tearDown() { } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/filesystem/FileRecordJobIT.java b/src/test/java/edu/harvard/iq/dataverse/api/filesystem/FileRecordJobIT.java index 25b6ec7371d..ffec1f48fd8 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/filesystem/FileRecordJobIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/filesystem/FileRecordJobIT.java @@ -93,7 +93,7 @@ public class FileRecordJobIT { private static final String API_TOKEN_HTTP_HEADER = "X-Dataverse-key"; private static final String BUILTIN_USER_KEY = "burrito"; - @BeforeClass + @BeforeAll public static void setUpClass() throws Exception { // this allows for testing on dataverse staging servers via jvm setting @@ -123,7 +123,7 @@ public static void setUpClass() throws Exception { } } - @Before + @BeforeEach public void setUpDataverse() { try { @@ -190,12 +190,12 @@ public void setUpDataverse() { } } - @AfterClass + @AfterAll public static void tearDownClass() { RestAssured.reset(); } - @After + @AfterEach public void tearDownDataverse() { try { @@ -232,7 +232,7 @@ public void tearDownDataverse() { * Ignores failed checksum manifest import. */ @Test - @Ignore + @Disabled public void testSameFileInDifferentDirectories() { try { @@ -311,7 +311,7 @@ public void testSameFileInDifferentDirectories() { } @Test - @Ignore + @Disabled public void testNewEditor() { try { @@ -415,7 +415,7 @@ public void testNewEditor() { * Ignores failed checksum manifest import. */ @Test - @Ignore + @Disabled public void testSameFileInDifferentDirectoriesUnauthorizedUser() { try { @@ -614,7 +614,7 @@ public void testSameFileInDifferentDirectoriesUnauthorizedUser() { // } @Test - @Ignore + @Disabled /** * Add a file in MERGE mode (default), should only need to commit the new file */ @@ -759,7 +759,7 @@ public void testAddingFilesInMergeMode() { } @Test - @Ignore + @Disabled /** * The success case: all files uploaded and present in checksum manifest */ @@ -828,7 +828,7 @@ public void testFilesWithChecksumManifest() { } @Test - @Ignore + @Disabled /** * No checksum manifest found */ @@ -882,7 +882,7 @@ public void testFilesWithoutChecksumManifest() { } @Test - @Ignore + @Disabled /** * Checksum manifest is missing an uploaded file */ @@ -949,7 +949,7 @@ public void testFileMissingInChecksumManifest() { } @Test - @Ignore + @Disabled /** * Checksum manifest references a file that isn't present, it should return failed status and detailed * message in persistentUserData @@ -1021,7 +1021,7 @@ public void testFileInChecksumManifestDoesntExist() { } @Test - @Ignore + @Disabled /** * Published datasets should not allow import jobs for now since it isn't in DRAFT mode */ @@ -1103,7 +1103,7 @@ public void testPublishedDataset() { // } @Test - @Ignore + @Disabled /** * No dataset found responses (bad dataset id, etc.) */ diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv6AddressTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv6AddressTest.java index a6ca37e975c..1fa6e7d2473 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv6AddressTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv6AddressTest.java @@ -16,11 +16,11 @@ public class IPv6AddressTest { public IPv6AddressTest() { } - @Before + @BeforeEach public void setUp() { } - @After + @AfterEach public void tearDown() { } diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/providers/builtin/BuiltinAuthenticationProviderTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/providers/builtin/BuiltinAuthenticationProviderTest.java index aceedd970b7..ff51260d43e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/providers/builtin/BuiltinAuthenticationProviderTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/providers/builtin/BuiltinAuthenticationProviderTest.java @@ -22,7 +22,7 @@ public class BuiltinAuthenticationProviderTest { MockBuiltinUserServiceBean bean = null; AuthenticationServiceBean authBean = null; - @Before + @BeforeEach public void setup() { bean = new MockBuiltinUserServiceBean(); passwordValidatorService = new MockPasswordValidatorServiceBean(); diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUserTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUserTest.java index 12e48216f49..9a2781a80bd 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUserTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUserTest.java @@ -52,7 +52,7 @@ public AuthenticatedUserTest() { public static final String IDENTIFIER_PREFIX = "@"; public static final Set mutedTypes = EnumSet.of(Type.ASSIGNROLE, Type.REVOKEROLE); - @Before + @BeforeEach public void setUp() { testUser = MocksFactory.makeAuthenticatedUser("Homer", "Simpson"); expResult = testUser.getCreatedTime(); diff --git a/src/test/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailDataTest.java b/src/test/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailDataTest.java index d807d8b9efe..10de20239e5 100644 --- a/src/test/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailDataTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailDataTest.java @@ -14,13 +14,13 @@ public class ConfirmEmailDataTest { private ConfirmEmailData instance; private AuthenticatedUser user; - @Before + @BeforeEach public void setUp() { this.user = new AuthenticatedUser(); this.instance = new ConfirmEmailData(user, 60); } - @After + @AfterEach public void tearDown() { this.instance = null; this.user = null; diff --git a/src/test/java/edu/harvard/iq/dataverse/dataaccess/FileAccessIOTest.java b/src/test/java/edu/harvard/iq/dataverse/dataaccess/FileAccessIOTest.java index d8a94585b38..552d76b74e8 100644 --- a/src/test/java/edu/harvard/iq/dataverse/dataaccess/FileAccessIOTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/dataaccess/FileAccessIOTest.java @@ -51,7 +51,7 @@ public class FileAccessIOTest { public FileAccessIOTest() { } - @Before + @BeforeEach public void setUpClass() throws IOException { dataverse = MocksFactory.makeDataverse(); dataset = MocksFactory.makeDataset(); @@ -77,7 +77,7 @@ public void setUpClass() throws IOException { } } - @After + @AfterEach public void tearDownClass() throws IOException { FileUtils.deleteDirectory(new File("/tmp/files/")); } diff --git a/src/test/java/edu/harvard/iq/dataverse/dataaccess/SwiftAccessIOTest.java b/src/test/java/edu/harvard/iq/dataverse/dataaccess/SwiftAccessIOTest.java index 115103450b8..942e4329384 100644 --- a/src/test/java/edu/harvard/iq/dataverse/dataaccess/SwiftAccessIOTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/dataaccess/SwiftAccessIOTest.java @@ -33,7 +33,7 @@ public class SwiftAccessIOTest { public SwiftAccessIOTest() { } - @Before + @BeforeEach public void setUpClass() throws IOException { datafile = MocksFactory.makeDataFile(); dataset = MocksFactory.makeDataset(); diff --git a/src/test/java/edu/harvard/iq/dataverse/datasetutility/DuplicateFileCheckerTest.java b/src/test/java/edu/harvard/iq/dataverse/datasetutility/DuplicateFileCheckerTest.java index 1fb05becfc8..42d6c2385b8 100644 --- a/src/test/java/edu/harvard/iq/dataverse/datasetutility/DuplicateFileCheckerTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/datasetutility/DuplicateFileCheckerTest.java @@ -19,13 +19,13 @@ public class DuplicateFileCheckerTest { private DuplicateFileChecker duplicateFileChecker; private DatasetVersionServiceBean datasetVersionServiceBean; - @Before + @BeforeEach public void setUp() { this.datasetVersionServiceBean = mock(DatasetVersionServiceBean.class); this.duplicateFileChecker = new DuplicateFileChecker(datasetVersionServiceBean); } - @After + @AfterEach public void tearDown() { duplicateFileChecker = null; } diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java index 985c70f834e..195c8854b26 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java @@ -165,7 +165,7 @@ public void deleteFacetsFor(Dataverse d) { TestDataverseEngine engine; - @Before + @BeforeEach public void setUp() { indexCalled = false; dvStore.clear(); diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreatePrivateUrlCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreatePrivateUrlCommandTest.java index 104a4f595a8..33f9acd0e1a 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreatePrivateUrlCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreatePrivateUrlCommandTest.java @@ -32,7 +32,7 @@ public class CreatePrivateUrlCommandTest { private final Long versionIsReleased = 4l; - @Before + @BeforeEach public void setUp() { dataset = new Dataset(); testEngine = new TestDataverseEngine(new TestCommandContext() { diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateRoleCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateRoleCommandTest.java index bd42a5469b3..ab4f9dae3db 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateRoleCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateRoleCommandTest.java @@ -52,7 +52,7 @@ public EntityManager em() { } }); - @Before + @BeforeEach public void before() { saveCalled = false; } diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/DeletePrivateUrlCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/DeletePrivateUrlCommandTest.java index 73b160e620d..0a4e5ed2d7e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/DeletePrivateUrlCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/DeletePrivateUrlCommandTest.java @@ -26,7 +26,7 @@ public class DeletePrivateUrlCommandTest { private final Long noPrivateUrlToDelete = 1l; private final Long hasPrivateUrlToDelete = 2l; - @Before + @BeforeEach public void setUp() { testEngine = new TestDataverseEngine(new TestCommandContext() { @Override diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/GetPrivateUrlCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/GetPrivateUrlCommandTest.java index d15162e4053..47174643a1c 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/GetPrivateUrlCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/GetPrivateUrlCommandTest.java @@ -20,15 +20,15 @@ public class GetPrivateUrlCommandTest { public GetPrivateUrlCommandTest() { } - @BeforeClass + @BeforeAll public static void setUpClass() { } - @AfterClass + @AfterAll public static void tearDownClass() { } - @Before + @BeforeEach public void setUp() { testEngine = new TestDataverseEngine(new TestCommandContext() { @@ -47,7 +47,7 @@ public PrivateUrl getPrivateUrlFromDatasetId(long datasetId) { }); } - @After + @AfterEach public void tearDown() { } diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/ListMetadataBlocksCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/ListMetadataBlocksCommandTest.java index 83780552639..0701454113b 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/ListMetadataBlocksCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/ListMetadataBlocksCommandTest.java @@ -26,7 +26,7 @@ public class ListMetadataBlocksCommandTest { private Dataverse dataverse; private DataverseMetadataBlockFacet metadataBlockFacet; - @Before + @BeforeEach public void beforeEachTest() { dataverseRequest = Mockito.mock(DataverseRequest.class); dataverse = Mockito.mock(Dataverse.class); diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDatasetCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDatasetCommandTest.java index 7c883b18cb5..9b2591a796e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDatasetCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDatasetCommandTest.java @@ -71,7 +71,7 @@ public class MoveDatasetCommandTest { @Context protected HttpServletRequest httpRequest; - @Before + @BeforeEach public void setUp() { auth = makeAuthenticatedUser("Super", "User"); diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDataverseCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDataverseCommandTest.java index ce56a732267..3725cc942e5 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDataverseCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDataverseCommandTest.java @@ -49,7 +49,7 @@ public class MoveDataverseCommandTest { AuthenticatedUser auth, nobody; protected HttpServletRequest httpRequest; - @Before + @BeforeEach public void setUp() { // authentication auth = makeAuthenticatedUser("Super", "User"); diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/RequestRsyncScriptCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/RequestRsyncScriptCommandTest.java index fef4b03b9a3..7609ef17d3e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/RequestRsyncScriptCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/RequestRsyncScriptCommandTest.java @@ -26,15 +26,15 @@ public class RequestRsyncScriptCommandTest { public RequestRsyncScriptCommandTest() { } - @BeforeClass + @BeforeAll public static void setUpClass() { } - @AfterClass + @AfterAll public static void tearDownClass() { } - @Before + @BeforeEach public void setUp() { testEngine = new TestDataverseEngine(new TestCommandContext() { @@ -66,7 +66,7 @@ public SettingsServiceBean settings() { }); } - @After + @AfterEach public void tearDown() { } diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/RestrictFileCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/RestrictFileCommandTest.java index 2e1abefb4d8..2b1dbc4c64a 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/RestrictFileCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/RestrictFileCommandTest.java @@ -46,15 +46,15 @@ public class RestrictFileCommandTest { public RestrictFileCommandTest() { } - @BeforeClass + @BeforeAll public static void setUpClass() { } - @AfterClass + @AfterAll public static void tearDownClass() { } - @Before + @BeforeEach public void setUp() { dataset = makeDataset(); file = makeDataFile(); @@ -76,7 +76,7 @@ public boolean isTrueForKey(SettingsServiceBean.Key key, boolean defaultValue) { } - @After + @AfterEach public void tearDown() { } @@ -249,7 +249,7 @@ public void testUnrestrictUnrestrictedNewFile() throws Exception { } - @Test + @Test public void testPublicInstall() throws CommandException { file.setOwner(dataset); String expected = "Restricting files is not permitted on a public installation."; diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/ReturnDatasetToAuthorCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/ReturnDatasetToAuthorCommandTest.java index e70771a3348..e7565c1ea64 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/ReturnDatasetToAuthorCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/ReturnDatasetToAuthorCommandTest.java @@ -39,7 +39,7 @@ public class ReturnDatasetToAuthorCommandTest { private DataverseRequest dataverseRequest; private TestDataverseEngine testEngine; - @Before + @BeforeEach public void setUp() { dataset = new Dataset(); diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/SubmitDatasetForReviewCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/SubmitDatasetForReviewCommandTest.java index 74a632e510a..0934f965b4b 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/SubmitDatasetForReviewCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/SubmitDatasetForReviewCommandTest.java @@ -38,7 +38,7 @@ public class SubmitDatasetForReviewCommandTest { private DataverseRequest dataverseRequest; private TestDataverseEngine testEngine; - @Before + @BeforeEach public void setUp() { dataset = new Dataset(); diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetThumbnailCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetThumbnailCommandTest.java index 45ecd1e03dd..34ea7810574 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetThumbnailCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetThumbnailCommandTest.java @@ -27,15 +27,15 @@ public class UpdateDatasetThumbnailCommandTest { public UpdateDatasetThumbnailCommandTest() { } - @BeforeClass + @BeforeAll public static void setUpClass() { } - @AfterClass + @AfterAll public static void tearDownClass() { } - @Before + @BeforeEach public void setUp() { dataset = new Dataset(); testEngine = new TestDataverseEngine(new TestCommandContext() { @@ -87,7 +87,7 @@ public String getDataverseSiteUrl() { ); } - @After + @AfterEach public void tearDown() { } diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateMetadataBlockFacetRootCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateMetadataBlockFacetRootCommandTest.java index 492344ea072..8504db878ca 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateMetadataBlockFacetRootCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateMetadataBlockFacetRootCommandTest.java @@ -26,7 +26,7 @@ public class UpdateMetadataBlockFacetRootCommandTest { private DataverseRequest dataverseRequest; private Dataverse dataverse; - @Before + @BeforeEach public void beforeEachTest() { dataverseRequest = Mockito.mock(DataverseRequest.class); dataverse = Mockito.mock(Dataverse.class); diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateMetadataBlockFacetsCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateMetadataBlockFacetsCommandTest.java index e2a08a6add4..4fd80e931a2 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateMetadataBlockFacetsCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateMetadataBlockFacetsCommandTest.java @@ -27,7 +27,7 @@ public class UpdateMetadataBlockFacetsCommandTest { private DataverseRequest dataverseRequest; private Dataverse dataverse; - @Before + @BeforeEach public void beforeEachTest() { dataverseRequest = Mockito.mock(DataverseRequest.class); dataverse = Mockito.mock(Dataverse.class); diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdatePermissionRootCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdatePermissionRootCommandTest.java index d2e64b3292d..1a46a8803a6 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdatePermissionRootCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdatePermissionRootCommandTest.java @@ -23,7 +23,7 @@ public class UpdatePermissionRootCommandTest { TestCommandContext testCommandContext; boolean serviceBeanCalled; - @Before + @BeforeEach public void setUp() { mockBean = new DataverseServiceBean() { @Override diff --git a/src/test/java/edu/harvard/iq/dataverse/feedback/FeedbackUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/feedback/FeedbackUtilTest.java index ecb7014af7d..7c31db5bee2 100644 --- a/src/test/java/edu/harvard/iq/dataverse/feedback/FeedbackUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/feedback/FeedbackUtilTest.java @@ -58,7 +58,7 @@ public class FeedbackUtilTest { private static final String systemEmail = "support@librascholar.edu"; private static final boolean weKnowHowToCreateMockAuthenticatedUsers = false; - @BeforeClass + @BeforeAll public static void setUpClass() throws IOException, JsonParseException, AddressException { if (weKnowHowToCreateMockAuthenticatedUsers) { diff --git a/src/test/java/edu/harvard/iq/dataverse/ingest/IngestableDataCheckerTest.java b/src/test/java/edu/harvard/iq/dataverse/ingest/IngestableDataCheckerTest.java index 305dcf82260..8bff81e7c87 100644 --- a/src/test/java/edu/harvard/iq/dataverse/ingest/IngestableDataCheckerTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/ingest/IngestableDataCheckerTest.java @@ -35,20 +35,20 @@ public class IngestableDataCheckerTest { public IngestableDataCheckerTest() { } - @BeforeClass + @BeforeAll public static void setUpClass() { } - @AfterClass + @AfterAll public static void tearDownClass() { } - @Before + @BeforeEach public void setUp() { } - @After + @AfterEach public void tearDown() { diff --git a/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/dta/NewDTAFileReaderTest.java b/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/dta/NewDTAFileReaderTest.java index 6960a6d0e7f..36e667336c8 100644 --- a/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/dta/NewDTAFileReaderTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/dta/NewDTAFileReaderTest.java @@ -81,7 +81,7 @@ public void testNull() throws IOException { } // TODO: Can we create a small file to check into the code base that exercises the value-label names non-zero offset issue? - @Ignore + @Disabled @Test public void testFirstCategoryNonZeroOffset() throws IOException { instance = new NewDTAFileReader(null, 117); @@ -102,7 +102,7 @@ public void testFirstCategoryNonZeroOffset() throws IOException { } // TODO: Can we create a small file to check into the code base that exercises the value-label names non-zero offset issue? - @Ignore + @Disabled @Test public void testFirstCategoryNonZeroOffset1() throws IOException { instance = new NewDTAFileReader(null, 118); @@ -122,7 +122,7 @@ public void testFirstCategoryNonZeroOffset1() throws IOException { } // TODO: Is there a way to exersise this code with a smaller file? 33k.dta is 21MB. - @Ignore + @Disabled @Test public void test33k() throws IOException { instance = new NewDTAFileReader(null, 119); @@ -132,7 +132,7 @@ public void test33k() throws IOException { // TODO: Can we create a small file to check into the code base that exercises the characteristics issue? // FIXME: testCharacteristics is passing in DTA117FileReaderTest but not here. - @Ignore + @Disabled @Test public void testCharacteristics() throws IOException { instance = new NewDTAFileReader(null, 117); diff --git a/src/test/java/edu/harvard/iq/dataverse/passwordreset/PasswordResetDataTest.java b/src/test/java/edu/harvard/iq/dataverse/passwordreset/PasswordResetDataTest.java index 0d04d715d19..d7831003142 100644 --- a/src/test/java/edu/harvard/iq/dataverse/passwordreset/PasswordResetDataTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/passwordreset/PasswordResetDataTest.java @@ -18,19 +18,19 @@ public class PasswordResetDataTest { public PasswordResetDataTest() { } - @BeforeClass + @BeforeAll public static void setUpClass() { } - @AfterClass + @AfterAll public static void tearDownClass() { } - @Before + @BeforeEach public void setUp() { } - @After + @AfterEach public void tearDown() { } diff --git a/src/test/java/edu/harvard/iq/dataverse/pidproviders/PidUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/pidproviders/PidUtilTest.java index 52dab3ddb6d..193a2b533ee 100644 --- a/src/test/java/edu/harvard/iq/dataverse/pidproviders/PidUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/pidproviders/PidUtilTest.java @@ -35,14 +35,15 @@ public class PidUtilTest { private PermaLinkPidProviderServiceBean p = new PermaLinkPidProviderServiceBean(); - @Before public void initMocks() { + @BeforeEach + public void initMocks() { MockitoAnnotations.initMocks(this); Mockito.when(settingsServiceBean.getValueForKey(SettingsServiceBean.Key.Protocol)).thenReturn("perma"); Mockito.when(settingsServiceBean.getValueForKey(SettingsServiceBean.Key.Authority)).thenReturn("DANSLINK"); p.reInit(); } - @Ignore + @Disabled @Test public void testGetDoi() throws IOException { String username = System.getenv("DataCiteUsername"); diff --git a/src/test/java/edu/harvard/iq/dataverse/provenance/ProvInvestigatorTest.java b/src/test/java/edu/harvard/iq/dataverse/provenance/ProvInvestigatorTest.java index 20b62bcbb0e..9ab9f87d15b 100644 --- a/src/test/java/edu/harvard/iq/dataverse/provenance/ProvInvestigatorTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/provenance/ProvInvestigatorTest.java @@ -28,7 +28,7 @@ public class ProvInvestigatorTest { JsonParser jsonParser; private static final Logger logger = Logger.getLogger(ProvInvestigatorTest.class.getCanonicalName()); - @Before + @BeforeEach public void setUp() { provUtilBean = ProvInvestigator.getInstance(); jsonParser = new JsonParser(); diff --git a/src/test/java/edu/harvard/iq/dataverse/search/IndexUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/search/IndexUtilTest.java index 84ea519e71f..9be53b8b8b1 100644 --- a/src/test/java/edu/harvard/iq/dataverse/search/IndexUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/search/IndexUtilTest.java @@ -14,19 +14,19 @@ public class IndexUtilTest { public IndexUtilTest() { } - @BeforeClass + @BeforeAll public static void setUpClass() { } - @AfterClass + @AfterAll public static void tearDownClass() { } - @Before + @BeforeEach public void setUp() { } - @After + @AfterEach public void tearDown() { } diff --git a/src/test/java/edu/harvard/iq/dataverse/search/SolrSearchResultTest.java b/src/test/java/edu/harvard/iq/dataverse/search/SolrSearchResultTest.java index 967b9bbdd5e..4fb29869db7 100644 --- a/src/test/java/edu/harvard/iq/dataverse/search/SolrSearchResultTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/search/SolrSearchResultTest.java @@ -35,7 +35,7 @@ public class SolrSearchResultTest { SolrSearchResult solrSearchResult; - @Before + @BeforeEach public void before() { this.unpublishedFlag = IndexServiceBean.getUNPUBLISHED_STRING(); this.publishedFlag = IndexServiceBean.getPUBLISHED_STRING(); @@ -47,7 +47,7 @@ public void before() { this.solrSearchResult = new SolrSearchResult("myQuery", "myName"); } - @After + @AfterEach public void after() { this.unpublishedFlag = null; this.publishedFlag = null; diff --git a/src/test/java/edu/harvard/iq/dataverse/search/SortByTest.java b/src/test/java/edu/harvard/iq/dataverse/search/SortByTest.java index f2c31f137a2..c8425198b83 100644 --- a/src/test/java/edu/harvard/iq/dataverse/search/SortByTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/search/SortByTest.java @@ -14,14 +14,14 @@ public class SortByTest { private String order; private SortBy instance; - @Before + @BeforeEach public void setUp() { this.field = "field"; this.order = SortBy.ASCENDING; this.instance = new SortBy(field, order); } - @After + @AfterEach public void tearDown() { this.field = null; this.order = null; diff --git a/src/test/java/edu/harvard/iq/dataverse/util/BitSetTest.java b/src/test/java/edu/harvard/iq/dataverse/util/BitSetTest.java index 51cd409c3f2..445c61e1857 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/BitSetTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/BitSetTest.java @@ -28,21 +28,21 @@ enum TestEnum { public BitSetTest() { } - @BeforeClass + @BeforeAll public static void setUpClass() { } - @AfterClass + @AfterAll public static void tearDownClass() { } BitSet sut; - @Before + @BeforeEach public void setUp() { sut = new BitSet(); } - @After + @AfterEach public void tearDown() { } diff --git a/src/test/java/edu/harvard/iq/dataverse/util/JhoveFileTypeTest.java b/src/test/java/edu/harvard/iq/dataverse/util/JhoveFileTypeTest.java index 2a08426ac6c..879c4bc1c4e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/JhoveFileTypeTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/JhoveFileTypeTest.java @@ -24,7 +24,7 @@ public class JhoveFileTypeTest { static File ico; static File ipynb; - @BeforeClass + @BeforeAll public static void setUpClass() { System.setProperty("com.sun.aas.instanceRoot", baseDirForConfigFiles); jhoveFileType = new JhoveFileType(); @@ -41,7 +41,7 @@ public static void setUpClass() { ipynb = new File("src/test/java/edu/harvard/iq/dataverse/util/irc-metrics.ipynb"); } - @AfterClass + @AfterAll public static void tearDownClass() { // SiteMapUtilTest relies on com.sun.aas.instanceRoot being null. System.clearProperty("com.sun.aas.instanceRoot"); diff --git a/src/test/java/edu/harvard/iq/dataverse/util/JsfHelperTest.java b/src/test/java/edu/harvard/iq/dataverse/util/JsfHelperTest.java index 466edc67b60..d5230a521b9 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/JsfHelperTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/JsfHelperTest.java @@ -25,19 +25,19 @@ public class JsfHelperTest { enum TestEnum { Lorem, Ipsum, Dolor, Sit, Amet } - @BeforeClass + @BeforeAll public static void setUpClass() { } - @AfterClass + @AfterAll public static void tearDownClass() { } - @Before + @BeforeEach public void setUp() { } - @After + @AfterEach public void tearDown() { } diff --git a/src/test/java/edu/harvard/iq/dataverse/util/LruCacheTest.java b/src/test/java/edu/harvard/iq/dataverse/util/LruCacheTest.java index f2c2a09d416..77aa09c3367 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/LruCacheTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/LruCacheTest.java @@ -14,12 +14,12 @@ public class LruCacheTest { LruCache sut; - @Before + @BeforeEach public void setUp() { sut = new LruCache<>(); } - @After + @AfterEach public void tearDown() { sut = null; } diff --git a/src/test/java/edu/harvard/iq/dataverse/util/MailUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/util/MailUtilTest.java index 89b0a7a738b..bbdf5a84fc3 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/MailUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/MailUtilTest.java @@ -27,7 +27,7 @@ public class MailUtilTest { @Mock SettingsServiceBean settingsSvc; - @Before + @BeforeEach public void setUp() { userNotification = new UserNotification(); diff --git a/src/test/java/edu/harvard/iq/dataverse/util/PersonOrOrgUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/util/PersonOrOrgUtilTest.java index f32f6b0873a..c3d9fd8fcd3 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/PersonOrOrgUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/PersonOrOrgUtilTest.java @@ -58,7 +58,7 @@ public void testOrganizationCommaOrDash() { verifyIsOrganization("Geographic Data Technology, Inc. (GDT)"); } - @Ignore + @Disabled @Test public void testOrganizationES() { //Spanish recognition is not enabled - see export/Organization.java diff --git a/src/test/java/edu/harvard/iq/dataverse/util/bagit/BagValidatorTest.java b/src/test/java/edu/harvard/iq/dataverse/util/bagit/BagValidatorTest.java index bb0ea50071d..1bca0932466 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/bagit/BagValidatorTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/bagit/BagValidatorTest.java @@ -33,7 +33,7 @@ public class BagValidatorTest { private ManifestReader manifestReader; private BagValidator target; - @Before + @BeforeEach public void beforeEachTest() { manifestReader = Mockito.mock(ManifestReader.class); target = Mockito.spy(new BagValidator(manifestReader)); diff --git a/src/test/java/edu/harvard/iq/dataverse/util/file/BagItFileHandlerTest.java b/src/test/java/edu/harvard/iq/dataverse/util/file/BagItFileHandlerTest.java index 7a58a8e04c1..b3975890d36 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/file/BagItFileHandlerTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/file/BagItFileHandlerTest.java @@ -47,7 +47,7 @@ public class BagItFileHandlerTest { private BagItFileHandler target; - @Before + @BeforeEach public void beforeEachTest() { FILE_UTIL = Mockito.mock(FileUtilWrapper.class, Mockito.RETURNS_DEEP_STUBS); SYSTEM_CONFIG = Mockito.mock(SystemConfig.class, Mockito.RETURNS_DEEP_STUBS); diff --git a/src/test/java/edu/harvard/iq/dataverse/util/json/DatasetVersionDTOTest.java b/src/test/java/edu/harvard/iq/dataverse/util/json/DatasetVersionDTOTest.java index 08c4a78795a..9ee2a7717dd 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/json/DatasetVersionDTOTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/json/DatasetVersionDTOTest.java @@ -34,19 +34,19 @@ public class DatasetVersionDTOTest { public DatasetVersionDTOTest() { } - @BeforeClass + @BeforeAll public static void setUpClass() { } - @AfterClass + @AfterAll public static void tearDownClass() { } - @Before + @BeforeEach public void setUp() { } - @After + @AfterEach public void tearDown() { } diff --git a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonParserTest.java b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonParserTest.java index 96437022da8..c1f9e398125 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonParserTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonParserTest.java @@ -82,15 +82,15 @@ public class JsonParserTest { public JsonParserTest() { } - @BeforeClass + @BeforeAll public static void setUpClass() { } - @AfterClass + @AfterAll public static void tearDownClass() { } - @Before + @BeforeEach public void setUp() { datasetFieldTypeSvc = new MockDatasetFieldSvc(); datasetFieldTypeSvc.setMetadataBlock("citation"); diff --git a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonPrinterTest.java b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonPrinterTest.java index 5d7e8eaa50e..1d054040e84 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonPrinterTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonPrinterTest.java @@ -37,7 +37,7 @@ public class JsonPrinterTest { MockDatasetFieldSvc datasetFieldTypeSvc = null; - @Before + @BeforeEach public void setUp() { datasetFieldTypeSvc = new MockDatasetFieldSvc(); datasetFieldTypeSvc.setMetadataBlock("citation"); From 930950a06d6f21714fe842b6d63cd8041f97ce73 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Fri, 18 Aug 2023 17:03:16 +0200 Subject: [PATCH 084/173] build(test): migrate JUnit 4 Categories to JUnit 5 Tags, adapt Maven Surefire config #9782 --- pom.xml | 2 +- .../harvard/iq/dataverse/NonEssentialTests.java | 10 ---------- .../provenance/ProvInvestigatorTest.java | 16 ++++++++-------- .../harvard/iq/dataverse/util/testing/Tags.java | 5 +++++ .../iq/dataverse/util/xml/XmlValidatorTest.java | 4 ++-- 5 files changed, 16 insertions(+), 21 deletions(-) delete mode 100644 src/test/java/edu/harvard/iq/dataverse/NonEssentialTests.java create mode 100644 src/test/java/edu/harvard/iq/dataverse/util/testing/Tags.java diff --git a/pom.xml b/pom.xml index eee3d956f38..3f3be6538c4 100644 --- a/pom.xml +++ b/pom.xml @@ -781,7 +781,7 @@ true - edu.harvard.iq.dataverse.NonEssentialTests + not-essential-unittests diff --git a/src/test/java/edu/harvard/iq/dataverse/NonEssentialTests.java b/src/test/java/edu/harvard/iq/dataverse/NonEssentialTests.java deleted file mode 100644 index 612904cbd26..00000000000 --- a/src/test/java/edu/harvard/iq/dataverse/NonEssentialTests.java +++ /dev/null @@ -1,10 +0,0 @@ -package edu.harvard.iq.dataverse; - -/** - * Tests annotated as non-essential will not be run by default on developers' - * laptops but they will run on continuous integration platforms like Travis CI. - * To work on one of these tests, you have to comment out the annotation. - */ -public interface NonEssentialTests { - -} diff --git a/src/test/java/edu/harvard/iq/dataverse/provenance/ProvInvestigatorTest.java b/src/test/java/edu/harvard/iq/dataverse/provenance/ProvInvestigatorTest.java index 9ab9f87d15b..f59f686a94c 100644 --- a/src/test/java/edu/harvard/iq/dataverse/provenance/ProvInvestigatorTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/provenance/ProvInvestigatorTest.java @@ -34,7 +34,7 @@ public void setUp() { jsonParser = new JsonParser(); } - @Category(NonEssentialTests.class) + @Tag(Tags.NOT_ESSENTIAL_UNITTESTS) @Test public void testProvValidator() { String validJsonString = "{\n" + @@ -106,7 +106,7 @@ public void testProvValidator() { } - @Category(NonEssentialTests.class) + @Tag(Tags.NOT_ESSENTIAL_UNITTESTS) @Test public void testProvNamesNotInsideEntity() throws IOException { //name and type on their own @@ -121,7 +121,7 @@ public void testProvNamesNotInsideEntity() throws IOException { assertFalse(entities.size() > 0); } - @Category(NonEssentialTests.class) + @Tag(Tags.NOT_ESSENTIAL_UNITTESTS) @Test public void testProvNameJsonParserEmptyEntities() throws IOException { String jsonString = "{\n" + @@ -160,8 +160,8 @@ public void testProvNameJsonParserEmptyEntities() throws IOException { //Note: this test has entity tags in multiple places, all with unique names //Only one entity is added to our list per unique name. - - @Category(NonEssentialTests.class) + + @Tag(Tags.NOT_ESSENTIAL_UNITTESTS) @Test public void testProvJsonWithEntitiesInMultiplePlaces() throws IOException { String jsonString = "{\n" + @@ -234,7 +234,7 @@ public void testProvJsonWithEntitiesInMultiplePlaces() throws IOException { assertTrue(entities.size() == 7); } - @Category(NonEssentialTests.class) + @Tag(Tags.NOT_ESSENTIAL_UNITTESTS) @Test public void testProvJsonWithEntitiesInMultiplePlacesWithSameNames() throws IOException { String jsonString = "{\n" + @@ -272,8 +272,8 @@ public void testProvJsonWithEntitiesInMultiplePlacesWithSameNames() throws IOExc assertTrue(entities.get("ex:report2").fileType.equals("not report")); assertTrue(entities.size() == 3); //ex:report2 & ex:report1 are repeated } - - @Category(NonEssentialTests.class) + + @Tag(Tags.NOT_ESSENTIAL_UNITTESTS) @Test public void testProvLongJsonWithEntities() throws IOException { String jsonString = "{\n" + diff --git a/src/test/java/edu/harvard/iq/dataverse/util/testing/Tags.java b/src/test/java/edu/harvard/iq/dataverse/util/testing/Tags.java new file mode 100644 index 00000000000..dcbd0529d8b --- /dev/null +++ b/src/test/java/edu/harvard/iq/dataverse/util/testing/Tags.java @@ -0,0 +1,5 @@ +package edu.harvard.iq.dataverse.util.testing; + +public class Tags { + public static final String NOT_ESSENTIAL_UNITTESTS = "not-essential-unittests"; +} diff --git a/src/test/java/edu/harvard/iq/dataverse/util/xml/XmlValidatorTest.java b/src/test/java/edu/harvard/iq/dataverse/util/xml/XmlValidatorTest.java index 6a870a7c3bf..f339691fde3 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/xml/XmlValidatorTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/xml/XmlValidatorTest.java @@ -20,8 +20,8 @@ public class XmlValidatorTest { //Ignored as this relies on an external resource that has been down occasionally. //May be a good test for our full vs. everytime test classifications (#4896) -MAD 4.9.1 - @Ignore - @Category(NonEssentialTests.class) + @Disabled + @Tag(Tags.NOT_ESSENTIAL_UNITTESTS) @Test public void testValidateXml() throws IOException, SAXException, ParserConfigurationException { assertTrue(XmlValidator.validateXmlSchema("src/test/java/edu/harvard/iq/dataverse/util/xml/sendToDataCite.xml", new URL("https://schema.datacite.org/meta/kernel-3/metadata.xsd"))); From 889a85788e3f1a0e66c866f20413e5075ad2e1d0 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Fri, 18 Aug 2023 17:24:13 +0200 Subject: [PATCH 085/173] build(test): migrate JUnit4 @runWith annotations to JUnit5 or delete where obsolete #9782 --- .../iq/dataverse/DataFileCategoryServiceBeanTest.java | 2 +- .../harvard/iq/dataverse/EditDataFilesPageHelperTest.java | 2 +- .../iq/dataverse/PersistentIdentifierServiceBeanTest.java | 2 +- .../java/edu/harvard/iq/dataverse/api/DataversesTest.java | 2 +- .../dataverse/api/imports/ImportGenericServiceBeanTest.java | 2 +- .../harvard/iq/dataverse/authorization/AuthUtilTest.java | 1 - .../authorization/providers/shib/ShibUtilTest.java | 1 - .../authorization/users/AuthenticatedUserTest.java | 2 +- .../iq/dataverse/confirmemail/ConfirmEmailUtilTest.java | 1 - .../edu/harvard/iq/dataverse/mydata/MyDataUtilTest.java | 3 +-- .../harvard/iq/dataverse/mydata/SolrQueryFormatterTest.java | 6 +----- .../iq/dataverse/passwordreset/PasswordValidatorTest.java | 1 - .../edu/harvard/iq/dataverse/pidproviders/PidUtilTest.java | 2 +- .../java/edu/harvard/iq/dataverse/util/JsfHelperTest.java | 5 ----- .../iq/dataverse/util/file/BagItFileHandlerFactoryTest.java | 2 +- .../iq/dataverse/validation/PasswordValidatorUtilTest.java | 1 - 16 files changed, 10 insertions(+), 25 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/DataFileCategoryServiceBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/DataFileCategoryServiceBeanTest.java index 6e6d176194b..53add343f4f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DataFileCategoryServiceBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DataFileCategoryServiceBeanTest.java @@ -21,7 +21,7 @@ * * @author adaybujeda */ -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class DataFileCategoryServiceBeanTest { @Mock diff --git a/src/test/java/edu/harvard/iq/dataverse/EditDataFilesPageHelperTest.java b/src/test/java/edu/harvard/iq/dataverse/EditDataFilesPageHelperTest.java index 621c05937f5..39d43fec191 100644 --- a/src/test/java/edu/harvard/iq/dataverse/EditDataFilesPageHelperTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/EditDataFilesPageHelperTest.java @@ -19,7 +19,7 @@ * * @author adaybujeda */ -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class EditDataFilesPageHelperTest { private static final String FILENAME = UUID.randomUUID().toString(); diff --git a/src/test/java/edu/harvard/iq/dataverse/PersistentIdentifierServiceBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/PersistentIdentifierServiceBeanTest.java index dcd0f583d9f..542d00d0d78 100644 --- a/src/test/java/edu/harvard/iq/dataverse/PersistentIdentifierServiceBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/PersistentIdentifierServiceBeanTest.java @@ -26,7 +26,7 @@ * * @author michael */ -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class PersistentIdentifierServiceBeanTest { @Mock diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DataversesTest.java b/src/test/java/edu/harvard/iq/dataverse/api/DataversesTest.java index a2f5c3335ee..212eb581fc8 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DataversesTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DataversesTest.java @@ -44,7 +44,7 @@ * * @author adaybujeda */ -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class DataversesTest { // From AbstractApiBean class @Mock diff --git a/src/test/java/edu/harvard/iq/dataverse/api/imports/ImportGenericServiceBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/api/imports/ImportGenericServiceBeanTest.java index b2ef3f24ff7..3e7d8407de5 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/imports/ImportGenericServiceBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/imports/ImportGenericServiceBeanTest.java @@ -8,7 +8,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class ImportGenericServiceBeanTest { @InjectMocks diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/AuthUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/AuthUtilTest.java index 7e659d03a5d..66c7fbbbc70 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/AuthUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/AuthUtilTest.java @@ -16,7 +16,6 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -@RunWith(Enclosed.class) public class AuthUtilTest { @RunWith(Parameterized.class) diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibUtilTest.java index 4c444c3e75d..c011ad3041d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibUtilTest.java @@ -15,7 +15,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mock; -@RunWith(Enclosed.class) public class ShibUtilTest { @RunWith(Parameterized.class) diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUserTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUserTest.java index 9a2781a80bd..6c430d0a09a 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUserTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUserTest.java @@ -35,7 +35,7 @@ * * @author bsilverstein */ -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class AuthenticatedUserTest { @Mock diff --git a/src/test/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailUtilTest.java index cf4759fe9f5..d2ef6a51a84 100644 --- a/src/test/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailUtilTest.java @@ -10,7 +10,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -@RunWith(Enclosed.class) public class ConfirmEmailUtilTest { @RunWith(Parameterized.class) diff --git a/src/test/java/edu/harvard/iq/dataverse/mydata/MyDataUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/mydata/MyDataUtilTest.java index 5aa840981ad..111d785f52d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/mydata/MyDataUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/mydata/MyDataUtilTest.java @@ -11,8 +11,7 @@ import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assumptions.assumeTrue; -@RunWith(Theories.class) -public class MyDataUtilTest { +class MyDataUtilTest { @DataPoints public static String[] userIdentifier = { diff --git a/src/test/java/edu/harvard/iq/dataverse/mydata/SolrQueryFormatterTest.java b/src/test/java/edu/harvard/iq/dataverse/mydata/SolrQueryFormatterTest.java index 9cd4cfcf41f..6f242d67dcf 100644 --- a/src/test/java/edu/harvard/iq/dataverse/mydata/SolrQueryFormatterTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/mydata/SolrQueryFormatterTest.java @@ -25,11 +25,7 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -/** - * - * @author rmp553 - */ -@RunWith(Enclosed.class) + public class SolrQueryFormatterTest { public static class SolrQueryFormatterNoParamTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/passwordreset/PasswordValidatorTest.java b/src/test/java/edu/harvard/iq/dataverse/passwordreset/PasswordValidatorTest.java index 6812ebf382c..2187ff3235d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/passwordreset/PasswordValidatorTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/passwordreset/PasswordValidatorTest.java @@ -8,7 +8,6 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -@RunWith(Parameterized.class) public class PasswordValidatorTest { public String password; diff --git a/src/test/java/edu/harvard/iq/dataverse/pidproviders/PidUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/pidproviders/PidUtilTest.java index 193a2b533ee..dabc7f68fce 100644 --- a/src/test/java/edu/harvard/iq/dataverse/pidproviders/PidUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/pidproviders/PidUtilTest.java @@ -27,7 +27,7 @@ /** * Useful for testing but requires DataCite credentials, etc. */ -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class PidUtilTest { @Mock private SettingsServiceBean settingsServiceBean; diff --git a/src/test/java/edu/harvard/iq/dataverse/util/JsfHelperTest.java b/src/test/java/edu/harvard/iq/dataverse/util/JsfHelperTest.java index d5230a521b9..0f68c1e7371 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/JsfHelperTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/JsfHelperTest.java @@ -16,11 +16,6 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -/** - * - * @author michael - */ -@RunWith(Parameterized.class) public class JsfHelperTest { enum TestEnum { Lorem, Ipsum, Dolor, Sit, Amet } diff --git a/src/test/java/edu/harvard/iq/dataverse/util/file/BagItFileHandlerFactoryTest.java b/src/test/java/edu/harvard/iq/dataverse/util/file/BagItFileHandlerFactoryTest.java index 1bff1e08baf..8b047443745 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/file/BagItFileHandlerFactoryTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/file/BagItFileHandlerFactoryTest.java @@ -15,7 +15,7 @@ * * @author adaybujeda */ -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class BagItFileHandlerFactoryTest { @Mock diff --git a/src/test/java/edu/harvard/iq/dataverse/validation/PasswordValidatorUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/validation/PasswordValidatorUtilTest.java index 6cec8955215..99d42cbb1ff 100644 --- a/src/test/java/edu/harvard/iq/dataverse/validation/PasswordValidatorUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/validation/PasswordValidatorUtilTest.java @@ -24,7 +24,6 @@ * * @author pdurbin */ -@RunWith(Enclosed.class) public class PasswordValidatorUtilTest { public static class PasswordValidatorUtilNoParamTest { From fbd7077814e9a9ba4e03b31a6cbf9cf0ec4001c8 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Fri, 18 Aug 2023 17:36:38 +0200 Subject: [PATCH 086/173] build(test): migrate exception testing from JUnit4 to JUnit5 style --- .../harvard/iq/dataverse/GlobalIdTest.java | 17 ++--- .../iq/dataverse/api/AbstractApiBeanTest.java | 12 ++-- .../iq/dataverse/api/FileMetadataIT.java | 7 +- .../impl/explicit/ExplicitGroupTest.java | 17 ++--- .../impl/ipaddress/ip/IPv4AddressTest.java | 6 +- .../impl/ipaddress/ip/IPv6AddressTest.java | 24 +++---- .../DuplicateFileCheckerTest.java | 38 +++++------ .../dataverse/DataverseUtilTest.java | 67 ++++--------------- .../impl/AbstractDatasetCommandTest.java | 18 ++--- .../impl/CreateDatasetVersionCommandTest.java | 6 +- .../impl/CreateDataverseCommandTest.java | 27 +++++--- .../command/impl/CreateRoleCommandTest.java | 13 ++-- .../command/impl/MoveDatasetCommandTest.java | 39 +++++------ .../impl/MoveDataverseCommandTest.java | 63 ++++++++--------- .../ReturnDatasetToAuthorCommandTest.java | 7 +- .../SubmitDatasetForReviewCommandTest.java | 7 +- .../UpdateMetadataBlockFacetsCommandTest.java | 6 +- .../impl/plugins/dta/DataReaderTest.java | 6 +- .../plugins/dta/NewDTAFileReaderTest.java | 6 +- .../locality/StorageSiteUtilTest.java | 27 ++++---- .../iq/dataverse/metrics/MetricsUtilTest.java | 20 +++--- .../iq/dataverse/util/BundleUtilTest.java | 10 +-- .../iq/dataverse/util/LruCacheTest.java | 6 +- .../dataverse/util/json/JsonParserTest.java | 58 ++++++++-------- 24 files changed, 229 insertions(+), 278 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/GlobalIdTest.java b/src/test/java/edu/harvard/iq/dataverse/GlobalIdTest.java index 7a615b15345..394f08c6e93 100644 --- a/src/test/java/edu/harvard/iq/dataverse/GlobalIdTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/GlobalIdTest.java @@ -16,9 +16,6 @@ */ public class GlobalIdTest { - @Rule - public ExpectedException exception = ExpectedException.none(); - @Test public void testValidDOI() { System.out.println("testValidDOI"); @@ -74,9 +71,9 @@ public void testUnknownProtocol() { System.out.println("testUnknownProtocol"); String badProtocol = "doy:10.5072/FK2/BYM3IW"; - - exception.expect(IllegalArgumentException.class); - exception.expectMessage("Failed to parse identifier: " + badProtocol); + + //exception.expect(IllegalArgumentException.class); + //exception.expectMessage("Failed to parse identifier: " + badProtocol); //new GlobalId(badProtocol); } @@ -85,8 +82,8 @@ public void testUnknownProtocol() { public void testBadIdentifierOnePart() { System.out.println("testBadIdentifierOnePart"); - exception.expect(IllegalArgumentException.class); - exception.expectMessage("Failed to parse identifier: 1part"); + //exception.expect(IllegalArgumentException.class); + //exception.expectMessage("Failed to parse identifier: 1part"); //new GlobalId("1part"); } @@ -95,8 +92,8 @@ public void testBadIdentifierOnePart() { public void testBadIdentifierTwoParts() { System.out.println("testBadIdentifierTwoParts"); - exception.expect(IllegalArgumentException.class); - exception.expectMessage("Failed to parse identifier: doi:2part/blah"); + //exception.expect(IllegalArgumentException.class); + //exception.expectMessage("Failed to parse identifier: doi:2part/blah"); //new GlobalId("doi:2part/blah"); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/AbstractApiBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/api/AbstractApiBeanTest.java index 860eeb47f4f..c67dfeeadfa 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/AbstractApiBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/AbstractApiBeanTest.java @@ -38,15 +38,15 @@ public void testParseBooleanOrDie_ok() throws Exception { assertFalse(sut.parseBooleanOrDie("0")); assertFalse(sut.parseBooleanOrDie("no")); } - - @Test(expected = Exception.class) - public void testParseBooleanOrDie_invalid() throws Exception { - sut.parseBooleanOrDie("I'm not a boolean value!"); + + @Test + void testParseBooleanOrDie_invalid() { + assertThrows(Exception.class, () -> sut.parseBooleanOrDie("I'm not a boolean value!")); } @Test - public void testFailIfNull_ok() throws Exception { - sut.failIfNull(sut, ""); + void testFailIfNull_ok() { + assertDoesNotThrow(() -> sut.failIfNull(sut, "")); } @Test diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FileMetadataIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FileMetadataIT.java index 8c87440b488..c867af75956 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FileMetadataIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FileMetadataIT.java @@ -80,8 +80,7 @@ public void setUpDataverse() { .then().assertThat().statusCode(201); System.out.println("DATAVERSE: " + RestAssured.baseURI + "/dataverse/" + testName); } catch (Exception e) { - System.out.println("Error setting up test dataverse: " + e.getMessage()); - fail(); + fail("Error setting up test dataverse: " + e.getMessage(), e); } } @@ -166,9 +165,7 @@ public void testJsonParserWithDirectoryLabels() { .statusCode(200); } catch (Exception e) { - System.out.println("Error testJsonParserWithDirectoryLabels: " + e.getMessage()); - e.printStackTrace(); - fail(); + fail("Error testJsonParserWithDirectoryLabels: " + e.getMessage(), e); } } diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/explicit/ExplicitGroupTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/explicit/ExplicitGroupTest.java index d95a95a8d3a..afa07be2e38 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/explicit/ExplicitGroupTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/explicit/ExplicitGroupTest.java @@ -34,15 +34,14 @@ public class ExplicitGroupTest { public ExplicitGroupTest() { } - @Test( expected=GroupException.class ) + @Test public void addGroupToSelf() throws Exception { ExplicitGroup sut = new ExplicitGroup(); sut.setDisplayName("a group"); - sut.add( sut ); - fail("A group cannot be added to itself."); + assertThrows(GroupException.class, () -> sut.add( sut ), "A group cannot be added to itself."); } - @Test( expected=GroupException.class ) + @Test public void addGroupToDescendant() throws GroupException{ Dataverse dv = makeDataverse(); ExplicitGroup root = new ExplicitGroup(prv); @@ -60,11 +59,10 @@ public void addGroupToDescendant() throws GroupException{ sub.add( subSub ); root.add( sub ); - subSub.add(root); - fail("A group cannot contain its parent"); + assertThrows(GroupException.class, () -> subSub.add(root), "A group cannot contain its parent"); } - @Test( expected=GroupException.class ) + @Test public void addGroupToUnrealtedGroup() throws GroupException { Dataverse dv1 = makeDataverse(); Dataverse dv2 = makeDataverse(); @@ -73,9 +71,8 @@ public void addGroupToUnrealtedGroup() throws GroupException { g1.setOwner(dv1); g2.setOwner(dv2); - g1.add(g2); - fail("An explicit group cannot contain an explicit group defined in " - + "a dataverse that's not an ancestor of that group's owner dataverse."); + assertThrows(GroupException.class, () -> g1.add(g2), "An explicit group cannot contain an" + + "explicit group defined in a dataverse that's not an ancestor of that group's owner dataverse."); } diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv4AddressTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv4AddressTest.java index 4bab4546ca4..4683d66decd 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv4AddressTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv4AddressTest.java @@ -22,9 +22,9 @@ public void testValueOf() { assertEquals( new IPv4Address(127,0,0,1), IPv4Address.valueOf("127.0.0.1") ); } - @Test( expected=IllegalArgumentException.class ) - public void testValueOf_bad() { - IPv4Address.valueOf("1.2.3"); + @Test + void testValueOf_bad() { + assertThrows(IllegalArgumentException.class, () -> IPv4Address.valueOf("1.2.3")); } @Test diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv6AddressTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv6AddressTest.java index 1fa6e7d2473..2f43bc64ce8 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv6AddressTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv6AddressTest.java @@ -109,24 +109,24 @@ public void testLocalhostness() { assertFalse(IPv6Address.valueOf("fff::1").isLocalhost()); } - @Test(expected = IllegalArgumentException.class) - public void testIllegalLength() { - IPv6Address.valueOf("0:1:2:3"); + @Test + void testIllegalLength() { + assertThrows(IllegalArgumentException.class, () -> IPv6Address.valueOf("0:1:2:3")); } - @Test(expected = IllegalArgumentException.class) - public void testIllegalLengthPrefix() { - IPv6Address.valueOf(":1:2:3"); + @Test + void testIllegalLengthPrefix() { + assertThrows(IllegalArgumentException.class, () -> IPv6Address.valueOf(":1:2:3")); } - @Test(expected = IllegalArgumentException.class) - public void testIllegalLengthSuffix() { - IPv6Address.valueOf("1:2:3:"); + @Test + void testIllegalLengthSuffix() { + assertThrows(IllegalArgumentException.class, () -> IPv6Address.valueOf("1:2:3:")); } - @Test(expected = IllegalArgumentException.class) - public void testIllegalNumber() { - IPv6Address.valueOf("::xxx"); + @Test + void testIllegalNumber() { + assertThrows(IllegalArgumentException.class, () -> IPv6Address.valueOf("::xxx")); } @Test diff --git a/src/test/java/edu/harvard/iq/dataverse/datasetutility/DuplicateFileCheckerTest.java b/src/test/java/edu/harvard/iq/dataverse/datasetutility/DuplicateFileCheckerTest.java index 42d6c2385b8..ced15594f85 100644 --- a/src/test/java/edu/harvard/iq/dataverse/datasetutility/DuplicateFileCheckerTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/datasetutility/DuplicateFileCheckerTest.java @@ -34,9 +34,9 @@ public void tearDown() { // test constructor // ---------------------------------------------------------------------------------------------------------- - @Test(expected = NullPointerException.class) - public void testConstructorWithUndefinedDatasetVersionService() { - DuplicateFileChecker duplicateFileChecker = new DuplicateFileChecker(null); + @Test + void testConstructorWithUndefinedDatasetVersionService() { + assertThrows(NullPointerException.class, () -> new DuplicateFileChecker(null)); } @Test @@ -49,20 +49,20 @@ public void testConstructorWithDefinedDatasetVersionService() { // test public boolean isFileInSavedDatasetVersion(DatasetVersion datasetVersion, String checkSum) // ---------------------------------------------------------------------------------------------------------- - @Test(expected = NullPointerException.class) - public void testIsFileInSavedDatasetVersionWithCheckSumParamWithUndefinedDatasetVersion() { + @Test + void testIsFileInSavedDatasetVersionWithCheckSumParamWithUndefinedDatasetVersion() { DatasetVersion datasetVersion = null; String checkSum = "checkSum"; - - this.duplicateFileChecker.isFileInSavedDatasetVersion(datasetVersion, checkSum); + + assertThrows(NullPointerException.class, () -> this.duplicateFileChecker.isFileInSavedDatasetVersion(datasetVersion, checkSum)); } - @Test(expected = NullPointerException.class) - public void testIsFileInSavedDatasetVersionWithChecksumParamWithUndefinedChecksum() { + @Test + void testIsFileInSavedDatasetVersionWithChecksumParamWithUndefinedChecksum() { DatasetVersion datasetVersion = new DatasetVersion(); String checkSum = null; - - this.duplicateFileChecker.isFileInSavedDatasetVersion(datasetVersion, checkSum); + + assertThrows(NullPointerException.class, () -> this.duplicateFileChecker.isFileInSavedDatasetVersion(datasetVersion, checkSum)); } @Test @@ -81,20 +81,20 @@ public void testIsFileInSavedDatasetVersionWithChecksumParamWithUnsavedFile() { // test public boolean isFileInSavedDatasetVersion(DatasetVersion datasetVersion, FileMetadata fileMetadata) // ---------------------------------------------------------------------------------------------------------- - @Test(expected = NullPointerException.class) - public void testIsFileInSavedDatasetVersionWithFileMetadataParamWithUndefinedDatasetVersion() { + @Test + void testIsFileInSavedDatasetVersionWithFileMetadataParamWithUndefinedDatasetVersion() { DatasetVersion datasetVersion = null; FileMetadata fileMetadata = new FileMetadata(); - - this.duplicateFileChecker.isFileInSavedDatasetVersion(datasetVersion, fileMetadata); + + assertThrows(NullPointerException.class, () -> this.duplicateFileChecker.isFileInSavedDatasetVersion(datasetVersion, fileMetadata)); } - @Test(expected = NullPointerException.class) - public void testIsFileInSavedDatasetVersionWithFileMetadataParamWithUndefinedFileMetadata() { + @Test + void testIsFileInSavedDatasetVersionWithFileMetadataParamWithUndefinedFileMetadata() { DatasetVersion datasetVersion = new DatasetVersion(); FileMetadata fileMetadata = null; - - this.duplicateFileChecker.isFileInSavedDatasetVersion(datasetVersion, fileMetadata); + + assertThrows(NullPointerException.class, () -> this.duplicateFileChecker.isFileInSavedDatasetVersion(datasetVersion, fileMetadata)); } @Test diff --git a/src/test/java/edu/harvard/iq/dataverse/dataverse/DataverseUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/dataverse/DataverseUtilTest.java index dacebac9117..01e0edd3073 100644 --- a/src/test/java/edu/harvard/iq/dataverse/dataverse/DataverseUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/dataverse/DataverseUtilTest.java @@ -44,69 +44,30 @@ public void testCheckMetadataLanguageCases() { definedFrenchD.setMetadataLanguage("fr"); Dataset definedSpanishD = new Dataset(); definedSpanishD.setMetadataLanguage("es"); + // Not set tests: //Good - no mLang sent, parent doesn't have one - try { - DataverseUtil.checkMetadataLangauge(undefinedD, undefinedParent, emptyMLangSettingMap); - } catch (BadRequestException e) { - Assert.fail(); - } + assertDoesNotThrow(() -> DataverseUtil.checkMetadataLangauge(undefinedD, undefinedParent, emptyMLangSettingMap)); //Bad - one sent, parent doesn't have one - try { - DataverseUtil.checkMetadataLangauge(definedEnglishD, undefinedParent, emptyMLangSettingMap); - Assert.fail(); - } catch (BadRequestException e) { - } + assertThrows(BadRequestException.class, () -> DataverseUtil.checkMetadataLangauge(definedEnglishD, undefinedParent, emptyMLangSettingMap)); //Good - one sent, matches parent - try { - DataverseUtil.checkMetadataLangauge(definedEnglishD, definedParent, emptyMLangSettingMap); - - } catch (BadRequestException e) { - Assert.fail(); - } + assertDoesNotThrow(() -> DataverseUtil.checkMetadataLangauge(definedEnglishD, definedParent, emptyMLangSettingMap)); //Bad - one sent, doesn't match parent - try { - DataverseUtil.checkMetadataLangauge(definedFrenchD, definedParent, emptyMLangSettingMap); - Assert.fail(); - } catch (BadRequestException e) { - } + assertThrows(BadRequestException.class, () -> DataverseUtil.checkMetadataLangauge(definedFrenchD, definedParent, emptyMLangSettingMap)); + //With setting tests - //Bad - one sent, parent doesn't have one - try { - DataverseUtil.checkMetadataLangauge(undefinedD, undefinedParent, mLangSettingMap); - Assert.fail(); - } catch (BadRequestException e) { - } + //Bad - one sent, parent doesn't have one + assertThrows(BadRequestException.class, () -> DataverseUtil.checkMetadataLangauge(undefinedD, undefinedParent, mLangSettingMap)); //Good - sent, parent undefined, is allowed by setting - try { - DataverseUtil.checkMetadataLangauge(definedEnglishD, undefinedParent, mLangSettingMap); - } catch (BadRequestException e) { - Assert.fail(); - } + assertDoesNotThrow(() -> DataverseUtil.checkMetadataLangauge(definedEnglishD, undefinedParent, mLangSettingMap)); //Bad one sent, parent undefined, not allowed by setting - try { - DataverseUtil.checkMetadataLangauge(definedSpanishD, undefinedParent, mLangSettingMap); - Assert.fail(); - } catch (BadRequestException e) { - } + assertThrows(BadRequestException.class, () -> DataverseUtil.checkMetadataLangauge(definedSpanishD, undefinedParent, mLangSettingMap)); //Bad - one sent, doesn't match parent - try { - DataverseUtil.checkMetadataLangauge(definedFrenchD, definedParent, mLangSettingMap); - Assert.fail(); - } catch (BadRequestException e) { - } + assertThrows(BadRequestException.class, () -> DataverseUtil.checkMetadataLangauge(definedFrenchD, definedParent, mLangSettingMap)); //Bad - undefined sent, parent is defined - try { - DataverseUtil.checkMetadataLangauge(undefinedD, definedParent, mLangSettingMap); - Assert.fail(); - } catch (BadRequestException e) { - } - //Good - sent, parent defined, they match - try { - DataverseUtil.checkMetadataLangauge(definedEnglishD, definedParent, mLangSettingMap); - } catch (BadRequestException e) { - Assert.fail(); - } + assertThrows(BadRequestException.class, () -> DataverseUtil.checkMetadataLangauge(undefinedD, definedParent, mLangSettingMap)); + //Good - sent, parent defined, they match + assertDoesNotThrow(() -> DataverseUtil.checkMetadataLangauge(definedEnglishD, definedParent, mLangSettingMap)); } } diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractDatasetCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractDatasetCommandTest.java index 388483bfefc..efadd14438a 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractDatasetCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractDatasetCommandTest.java @@ -19,16 +19,18 @@ public class AbstractDatasetCommandTest { - @Test(expected=IllegalArgumentException.class) - @SuppressWarnings("ResultOfObjectAllocationIgnored") - public void testNullDataset() { - new AbstractDatasetCommandImpl(makeRequest(), null); + @Test + void testNullDataset() { + DataverseRequest request = makeRequest(); + assertThrows(IllegalArgumentException.class, () -> new AbstractDatasetCommandImpl(request, null)); } - @Test(expected=IllegalArgumentException.class) - @SuppressWarnings("ResultOfObjectAllocationIgnored") - public void testNullDatasetNonNullParent() { - new AbstractDatasetCommandImpl(makeRequest(), null, makeDataverse()); + @Test + void testNullDatasetNonNullParent() { + DataverseRequest request = makeRequest(); + Dataverse dataverse = makeDataverse(); + assertThrows(IllegalArgumentException.class, + () -> new AbstractDatasetCommandImpl(request, null, dataverse)); } /** diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDatasetVersionCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDatasetVersionCommandTest.java index ca266d5208f..a2d9cdfb917 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDatasetVersionCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDatasetVersionCommandTest.java @@ -70,8 +70,8 @@ public void testSimpleVersionAddition() throws Exception { assertEquals(expected, testEngine.getReqiredPermissionsForObjects() ); } - @Test(expected=IllegalCommandException.class) - public void testCantCreateTwoDraftVersions() throws Exception { + @Test + void testCantCreateTwoDraftVersions() { DatasetVersion dsvNew = new DatasetVersion(); dsvNew.setVersionState(DatasetVersion.VersionState.DRAFT); Dataset sampleDataset = makeDataset(); @@ -89,7 +89,7 @@ public DatasetServiceBean datasets() { }); - testEngine.submit(sut); + assertThrows(IllegalCommandException.class, () -> testEngine.submit(sut)); } diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java index 195c8854b26..a52c06edf5e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java @@ -299,31 +299,38 @@ public void testCustomOptions() throws CommandException { } } - @Test( expected=IllegalCommandException.class ) - public void testCantCreateAdditionalRoot() throws Exception { - engine.submit( new CreateDataverseCommand(makeDataverse(), makeRequest(), null, null) ); + @Test + void testCantCreateAdditionalRoot() { + assertThrows(IllegalCommandException.class, + () -> engine.submit( new CreateDataverseCommand(makeDataverse(), makeRequest(), null, null) ) + ); } - @Test( expected=IllegalCommandException.class ) - public void testGuestCantCreateDataverse() throws Exception { + @Test + void testGuestCantCreateDataverse() { final DataverseRequest request = new DataverseRequest( GuestUser.get(), IpAddress.valueOf("::") ); isRootDvExists = false; - engine.submit(new CreateDataverseCommand(makeDataverse(), request, null, null) ); + assertThrows(IllegalCommandException.class, + () -> engine.submit(new CreateDataverseCommand(makeDataverse(), request, null, null) ) + ); } - @Test( expected=IllegalCommandException.class ) - public void testCantCreateAnotherWithSameAlias() throws Exception { + @Test + void testCantCreateAnotherWithSameAlias() { String alias = "alias"; final Dataverse dvFirst = makeDataverse(); dvFirst.setAlias(alias); dvFirst.setOwner( makeDataverse() ); - engine.submit(new CreateDataverseCommand(dvFirst, makeRequest(), null, null) ); + assertThrows(IllegalCommandException.class, + () -> engine.submit(new CreateDataverseCommand(dvFirst, makeRequest(), null, null) )); final Dataverse dv = makeDataverse(); dv.setOwner( makeDataverse() ); dv.setAlias(alias); - engine.submit(new CreateDataverseCommand(dv, makeRequest(), null, null) ); + assertThrows(IllegalCommandException.class, + () -> engine.submit(new CreateDataverseCommand(dv, makeRequest(), null, null) ) + ); } } diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateRoleCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateRoleCommandTest.java index ab4f9dae3db..b1b1636f8e2 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateRoleCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateRoleCommandTest.java @@ -57,8 +57,8 @@ public void before() { saveCalled = false; } - @Test( expected = IllegalCommandException.class ) - public void testNonSuperUsersCantAddRoles() throws CommandException { + @Test + void testNonSuperUsersCantAddRoles() { DataverseRole dvr = new DataverseRole(); dvr.setAlias("roleTest"); dvr.setName("Tester Role"); @@ -71,8 +71,7 @@ public void testNonSuperUsersCantAddRoles() throws CommandException { normalUser.setSuperuser(false); CreateRoleCommand sut = new CreateRoleCommand(dvr, new DataverseRequest(normalUser,IpAddress.valueOf("89.17.33.33")), dv); - engine.submit(sut); - + assertThrows(IllegalCommandException.class, () -> engine.submit(sut)); } @Test @@ -94,8 +93,8 @@ public void testSuperUsersAddRoles() throws CommandException { } - @Test( expected = IllegalCommandException.class ) - public void testGuestUsersCantAddRoles() throws CommandException { + @Test + void testGuestUsersCantAddRoles() { DataverseRole dvr = new DataverseRole(); dvr.setAlias("roleTest"); dvr.setName("Tester Role"); @@ -105,7 +104,7 @@ public void testGuestUsersCantAddRoles() throws CommandException { dvr.setOwner(dv); CreateRoleCommand sut = new CreateRoleCommand(dvr, new DataverseRequest(GuestUser.get(),IpAddress.valueOf("89.17.33.33")), dv); - engine.submit(sut); + assertThrows(IllegalCommandException.class, () -> engine.submit(sut)); } private class LocalTestEntityManager extends TestEntityManager { diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDatasetCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDatasetCommandTest.java index 9b2591a796e..ed6112539ed 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDatasetCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDatasetCommandTest.java @@ -283,13 +283,11 @@ public void testRemoveGuestbook() throws Exception { * Moving DS to its owning DV * @throws IllegalCommandException */ - @Test(expected = IllegalCommandException.class) - public void testInvalidMove() throws Exception { - + @Test + void testInvalidMove() { DataverseRequest aRequest = new DataverseRequest(auth, httpRequest); - testEngine.submit( - new MoveDatasetCommand(aRequest, moved, root, false)); - fail(); + assertThrows(IllegalCommandException.class, + () -> testEngine.submit(new MoveDatasetCommand(aRequest, moved, root, false))); } /** @@ -301,14 +299,13 @@ public void testInvalidMove() throws Exception { * Ignoring after permissions change in 47fb045. Did that change make this * case untestable? Unclear. */ - @Ignore - @Test(expected = PermissionException.class) - public void testAuthenticatedUserWithNoRole() throws Exception { + @Disabled("Unstable test. Disabled since #5115 by @pdurbin. See commit 7a917177") + @Test + void testAuthenticatedUserWithNoRole() { DataverseRequest aRequest = new DataverseRequest(nobody, httpRequest); - testEngine.submit( - new MoveDatasetCommand(aRequest, moved, childA, null)); - fail(); + assertThrows(IllegalCommandException.class, + () -> testEngine.submit(new MoveDatasetCommand(aRequest, moved, childA, null))); } /** @@ -317,25 +314,23 @@ public void testAuthenticatedUserWithNoRole() throws Exception { * * @throws java.lang.Exception */ - @Test(expected = PermissionException.class) - public void testNotAuthenticatedUser() throws Exception { + @Test + void testNotAuthenticatedUser() { DataverseRequest aRequest = new DataverseRequest(GuestUser.get(), httpRequest); - testEngine.submit( - new MoveDatasetCommand(aRequest, moved, root, null)); - fail(); + assertThrows(PermissionException.class, + () -> testEngine.submit(new MoveDatasetCommand(aRequest, moved, root, null))); } /** * Moving published DS to unpublished DV * @throws IllegalCommandException */ - @Test(expected = IllegalCommandException.class) - public void testInvalidMovePublishedToUnpublished() throws Exception { + @Test + void testInvalidMovePublishedToUnpublished() { DataverseRequest aRequest = new DataverseRequest(auth, httpRequest); - testEngine.submit( - new MoveDatasetCommand(aRequest, moved, childDraft, null)); - fail(); + assertThrows(IllegalCommandException.class, + () -> testEngine.submit(new MoveDatasetCommand(aRequest, moved, childDraft, null))); } diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDataverseCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDataverseCommandTest.java index 3725cc942e5..3c3188da830 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDataverseCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/MoveDataverseCommandTest.java @@ -302,43 +302,39 @@ public void testValidMove() throws Exception { /** * Moving ChildA to its child (illegal). */ - @Test( expected=IllegalCommandException.class ) - public void testInvalidMove() throws Exception { + @Test + void testInvalidMove() { System.out.println("testInvalidMove"); DataverseRequest aRequest = new DataverseRequest(auth, httpRequest); - testEngine.submit( - new MoveDataverseCommand(aRequest, childA, grandchildAA, null)); - fail(); + assertThrows(IllegalCommandException.class, + () -> testEngine.submit(new MoveDataverseCommand(aRequest, childA, grandchildAA, null))); } /** * Calling API as a non super user (illegal). */ - @Test(expected = PermissionException.class) - public void testNotSuperUser() throws Exception { + @Test + void testNotSuperUser() { System.out.println("testNotSuperUser"); DataverseRequest aRequest = new DataverseRequest(nobody, httpRequest); - testEngine.submit( - new MoveDataverseCommand(aRequest, childB, childA, null)); - fail(); + assertThrows(PermissionException.class, + () -> testEngine.submit(new MoveDataverseCommand(aRequest, childB, childA, null))); } - @Test( expected=IllegalCommandException.class ) - public void testMoveIntoSelf() throws Exception { + @Test + void testMoveIntoSelf() { System.out.println("testMoveIntoSelf"); DataverseRequest aRequest = new DataverseRequest(auth, httpRequest); - testEngine.submit( - new MoveDataverseCommand(aRequest, childB, childB, null)); - fail(); + assertThrows(IllegalCommandException.class, + () -> testEngine.submit(new MoveDataverseCommand(aRequest, childB, childB, null))); } - @Test( expected=IllegalCommandException.class ) - public void testMoveIntoParent() throws Exception { + @Test + void testMoveIntoParent() { System.out.println("testMoveIntoParent"); DataverseRequest aRequest = new DataverseRequest(auth, httpRequest); - testEngine.submit( - new MoveDataverseCommand(aRequest, grandchildAA, childA, null)); - fail(); + assertThrows(IllegalCommandException.class, + () -> testEngine.submit(new MoveDataverseCommand(aRequest, grandchildAA, childA, null))); } @Test @@ -355,13 +351,12 @@ public void testKeepGuestbook() throws Exception { assertEquals( root, childC.getOwner() ); } - @Test(expected = IllegalCommandException.class) - public void testRemoveGuestbookWithoutForce() throws Exception { + @Test + void testRemoveGuestbookWithoutForce() { System.out.println("testRemoveGuestbookWithoutForce"); DataverseRequest aRequest = new DataverseRequest(auth, httpRequest); - testEngine.submit( - new MoveDataverseCommand(aRequest, grandchildCC, root, null)); - fail(); + assertThrows(IllegalCommandException.class, + () -> testEngine.submit(new MoveDataverseCommand(aRequest, grandchildCC, root, null))); } @Test @@ -393,13 +388,12 @@ public void testKeepTemplate() throws Exception { } - @Test(expected = IllegalCommandException.class) - public void testRemoveTemplateWithoutForce() throws Exception { + @Test + void testRemoveTemplateWithoutForce() { System.out.println("testRemoveTemplateWithoutForce"); DataverseRequest aRequest = new DataverseRequest(auth, httpRequest); - testEngine.submit( - new MoveDataverseCommand(aRequest, grandchildDD, root, null)); - fail(); + assertThrows(IllegalCommandException.class, + () -> testEngine.submit(new MoveDataverseCommand(aRequest, grandchildDD, root, null))); } @Test @@ -430,13 +424,12 @@ public void testKeepMetadataBlock() throws Exception { assertEquals( root, childE.getOwner() ); } - @Test(expected = IllegalCommandException.class) - public void testRemoveMetadataBlockWithoutForce() throws Exception { + @Test + void testRemoveMetadataBlockWithoutForce() { System.out.println("testRemoveMetadataBlockWithoutForce"); DataverseRequest aRequest = new DataverseRequest(auth, httpRequest); - testEngine.submit( - new MoveDataverseCommand(aRequest, grandchildEE, root, null)); - fail(); + assertThrows(IllegalCommandException.class, + () -> testEngine.submit(new MoveDataverseCommand(aRequest, grandchildEE, root, null))); } @Test diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/ReturnDatasetToAuthorCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/ReturnDatasetToAuthorCommandTest.java index e7565c1ea64..23cc4547bc4 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/ReturnDatasetToAuthorCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/ReturnDatasetToAuthorCommandTest.java @@ -141,9 +141,10 @@ public List getUsersWithPermissionOn(Permission permission, D throw new IllegalCommandException("You must enter a reason for returning a dataset to its author.", this); } */ - @Test(expected=IllegalArgumentException.class) - public void testDatasetNull() throws CommandException { - new ReturnDatasetToAuthorCommand(dataverseRequest, null, ""); + @Test + void testDatasetNull() { + assertThrows(IllegalArgumentException.class, + () -> new ReturnDatasetToAuthorCommand(dataverseRequest, null, "")); } @Test diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/SubmitDatasetForReviewCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/SubmitDatasetForReviewCommandTest.java index 0934f965b4b..700ba332247 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/SubmitDatasetForReviewCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/SubmitDatasetForReviewCommandTest.java @@ -136,9 +136,10 @@ public List getUsersWithPermissionOn(Permission permission, D ); } - @Test( expected=IllegalArgumentException.class ) - public void testDatasetNull() { - new SubmitDatasetForReviewCommand(dataverseRequest, null); + @Test + void testDatasetNull() { + assertThrows(IllegalArgumentException.class, + () -> new SubmitDatasetForReviewCommand(dataverseRequest, null)); } @Test diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateMetadataBlockFacetsCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateMetadataBlockFacetsCommandTest.java index 4fd80e931a2..51892f20df3 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateMetadataBlockFacetsCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateMetadataBlockFacetsCommandTest.java @@ -33,14 +33,14 @@ public void beforeEachTest() { dataverse = Mockito.mock(Dataverse.class); } - @Test(expected = IllegalCommandException.class) - public void should_throw_IllegalCommandException_when_dataverse_is_not_metadata_facet_root() throws CommandException { + @Test + void should_throw_IllegalCommandException_when_dataverse_is_not_metadata_facet_root() { Mockito.when(dataverse.isMetadataBlockFacetRoot()).thenReturn(false); UpdateMetadataBlockFacetsCommand target = new UpdateMetadataBlockFacetsCommand(dataverseRequest, dataverse, Collections.emptyList()); CommandContext context = Mockito.mock(CommandContext.class, Mockito.RETURNS_DEEP_STUBS); - target.execute(context); + Assertions.assertThrows(IllegalCommandException.class, () -> target.execute(context)); } @Test diff --git a/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/dta/DataReaderTest.java b/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/dta/DataReaderTest.java index 940d625115c..a181f73c058 100644 --- a/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/dta/DataReaderTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/dta/DataReaderTest.java @@ -39,12 +39,12 @@ public void testReadUShort() throws IOException { } // This should throw until we figure out what to do with uLongs that are large - @Test(expected = IOException.class) - public void testReadULong() throws IOException { + @Test + void testReadULong() throws IOException { byte[] bytes = {-1,-1,-1,-1,-1,-1,-1,-1,}; BufferedInputStream stream = new BufferedInputStream(new ByteArrayInputStream(bytes)); DataReader reader = new DataReader(stream); reader.setLSF(true); - assertEquals(-1, reader.readULong()); + assertThrows(IOException.class, () -> reader.readULong()); } } diff --git a/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/dta/NewDTAFileReaderTest.java b/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/dta/NewDTAFileReaderTest.java index 36e667336c8..4a1acdfa607 100644 --- a/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/dta/NewDTAFileReaderTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/dta/NewDTAFileReaderTest.java @@ -74,10 +74,10 @@ public void testDates() throws IOException { assertEquals(expected, FileUtils.readFileToString(result.getTabDelimitedFile())); } - @Test(expected = IOException.class) - public void testNull() throws IOException { + @Test + void testNull() { instance = new NewDTAFileReader(null, 117); - TabularDataIngest result = instance.read(null, new File("")); + assertThrows(IOException.class, () -> instance.read(null, new File(""))); } // TODO: Can we create a small file to check into the code base that exercises the value-label names non-zero offset issue? diff --git a/src/test/java/edu/harvard/iq/dataverse/locality/StorageSiteUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/locality/StorageSiteUtilTest.java index 6bc7aaad186..b2f70ba2675 100644 --- a/src/test/java/edu/harvard/iq/dataverse/locality/StorageSiteUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/locality/StorageSiteUtilTest.java @@ -25,44 +25,47 @@ public void testParse() throws Exception { System.out.println("output: " + output); } - @Test(expected = IllegalArgumentException.class) - public void testMissingHostname() throws Exception { + @Test + void testMissingHostname() { JsonObjectBuilder job = Json.createObjectBuilder(); job.add(StorageSite.NAME, "myName"); job.add(StorageSite.PRIMARY_STORAGE, true); job.add(StorageSite.TRANSFER_PROTOCOLS, "rsync"); - StorageSiteUtil.parse(job.build()); + JsonObject sut = job.build(); + assertThrows(IllegalArgumentException.class, () -> StorageSiteUtil.parse(sut)); } - @Test(expected = IllegalArgumentException.class) - public void testBadProtocol() throws Exception { + @Test + void testBadProtocol() { JsonObjectBuilder job = Json.createObjectBuilder(); job.add(StorageSite.HOSTNAME, "myHostname"); job.add(StorageSite.NAME, "myName"); job.add(StorageSite.PRIMARY_STORAGE, true); job.add(StorageSite.TRANSFER_PROTOCOLS, "junk"); - StorageSiteUtil.parse(job.build()); + JsonObject sut = job.build(); + assertThrows(IllegalArgumentException.class, () -> StorageSiteUtil.parse(sut)); } - @Test(expected = IllegalArgumentException.class) - public void testNonBoolean() throws Exception { + @Test + void testNonBoolean() { JsonObjectBuilder job = Json.createObjectBuilder(); job.add(StorageSite.HOSTNAME, "myHostname"); job.add(StorageSite.NAME, "myName"); job.add(StorageSite.PRIMARY_STORAGE, "not a boolean"); job.add(StorageSite.TRANSFER_PROTOCOLS, "rsync"); - StorageSiteUtil.parse(job.build()); + JsonObject sut = job.build(); + assertThrows(IllegalArgumentException.class, () -> StorageSiteUtil.parse(sut)); } - @Test(expected = Exception.class) - public void testSecondPrimaryNotAllowed() throws Exception { + @Test + void testSecondPrimaryNotAllowed() { StorageSite newStorageSite = new StorageSite(); newStorageSite.setPrimaryStorage(true); List exitingSites = new ArrayList<>(); StorageSite existingSite1 = new StorageSite(); existingSite1.setPrimaryStorage(true); exitingSites.add(existingSite1); - StorageSiteUtil.ensureOnlyOnePrimary(newStorageSite, exitingSites); + assertThrows(Exception.class, () -> StorageSiteUtil.ensureOnlyOnePrimary(newStorageSite, exitingSites)); } @Test diff --git a/src/test/java/edu/harvard/iq/dataverse/metrics/MetricsUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/metrics/MetricsUtilTest.java index 827e450eff7..bb42bda68ea 100644 --- a/src/test/java/edu/harvard/iq/dataverse/metrics/MetricsUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/metrics/MetricsUtilTest.java @@ -144,23 +144,23 @@ public void testDataversesBySubjectToJson() { } @Test - public void testSanitizeHappyPath() throws Exception { + void testSanitizeHappyPath() { assertEquals("2018-04", MetricsUtil.sanitizeYearMonthUserInput("2018-04")); } - @Test(expected = Exception.class) - public void testSanitizeJunk() throws Exception { - MetricsUtil.sanitizeYearMonthUserInput("junk"); + @Test + void testSanitizeJunk() { + assertThrows(Exception.class, () -> MetricsUtil.sanitizeYearMonthUserInput("junk")); } - @Test(expected = Exception.class) - public void testSanitizeFullIso() throws Exception { - MetricsUtil.sanitizeYearMonthUserInput("2018-01-01"); + @Test + void testSanitizeFullIso() { + assertThrows(Exception.class, () -> MetricsUtil.sanitizeYearMonthUserInput("2018-01-01")); } - @Test(expected = Exception.class) - public void testSanitizeYearMonthUserInputIsAfterCurrentDate() throws Exception { - MetricsUtil.sanitizeYearMonthUserInput("2099-01"); + @Test + void testSanitizeYearMonthUserInputIsAfterCurrentDate() { + assertThrows(Exception.class, () -> MetricsUtil.sanitizeYearMonthUserInput("2099-01")); } @Test diff --git a/src/test/java/edu/harvard/iq/dataverse/util/BundleUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/util/BundleUtilTest.java index c7dc13fcaff..8f788154a93 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/BundleUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/BundleUtilTest.java @@ -81,14 +81,14 @@ public void testStringFromPropertyFile() { } //To assure that the MissingResourceException bubble up from this call - @Test(expected = MissingResourceException.class) - public void testStringFromPropertyFileException() { - BundleUtil.getStringFromPropertyFile("FAKE","MimeTypeFacets"); + @Test + void testStringFromPropertyFileException() { + assertThrows(MissingResourceException.class, () -> BundleUtil.getStringFromPropertyFile("FAKE","MimeTypeFacets")); } //To assure MissingResourceException is caught when calling normal bundle calls @Test - public void testNoErrorNonExistentStringBundle() { - BundleUtil.getStringFromBundle("FAKE", null, BundleUtil.getResourceBundle("MimeTypeFacets")); + void testNoErrorNonExistentStringBundle() { + assertDoesNotThrow(() -> BundleUtil.getStringFromBundle("FAKE", null, BundleUtil.getResourceBundle("MimeTypeFacets"))); } } diff --git a/src/test/java/edu/harvard/iq/dataverse/util/LruCacheTest.java b/src/test/java/edu/harvard/iq/dataverse/util/LruCacheTest.java index 77aa09c3367..122cf39e2c3 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/LruCacheTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/LruCacheTest.java @@ -66,9 +66,9 @@ public void testLRU() { } - @Test(expected = IllegalArgumentException.class) - public void testSetMaxSizeWithException() { - sut.setMaxSize(0l); + @Test + void testSetMaxSizeWithException() { + assertThrows(IllegalArgumentException.class, () -> sut.setMaxSize(0l)); } @Test diff --git a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonParserTest.java b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonParserTest.java index c1f9e398125..6576c1cfd84 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonParserTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonParserTest.java @@ -185,8 +185,8 @@ public void testControlledVocalRepeatsRoundTrip() throws JsonParseException { } - @Test(expected=JsonParseException.class) - public void testChildValidation() throws JsonParseException { + @Test + void testChildValidation() { // This Json String is a compound field that contains the wrong // fieldType as a child ("description" is not a child of "coordinate"). // It should throw a JsonParseException when it encounters the invalid child. @@ -211,8 +211,8 @@ public void testChildValidation() throws JsonParseException { JsonReader jsonReader = Json.createReader(new StringReader(text)); JsonObject obj = jsonReader.readObject(); - sut.parseField(obj); - } + assertThrows(JsonParseException.class, () -> sut.parseField(obj)); + } @Test @@ -334,12 +334,12 @@ public void testParseMinimalDataverse() throws JsonParseException { * @throws JsonParseException if all goes well - this is expected. * @throws IOException when test file IO goes wrong - this is bad. */ - @Test(expected = JsonParseException.class) - public void testParseNoAliasDataverse() throws JsonParseException, IOException { + @Test + void testParseNoAliasDataverse() throws IOException { JsonObject dvJson; try (InputStream jsonFile = ClassLoader.getSystemResourceAsStream("json/no-alias-dataverse.json")) { dvJson = Json.createReader(jsonFile).readObject(); - Dataverse actual = sut.parseDataverse(dvJson); + assertThrows(JsonParseException.class, () -> sut.parseDataverse(dvJson)); } } @@ -348,12 +348,12 @@ public void testParseNoAliasDataverse() throws JsonParseException, IOException { * @throws JsonParseException if all goes well - this is expected. * @throws IOException when test file IO goes wrong - this is bad. */ - @Test(expected = JsonParseException.class) - public void testParseNoNameDataverse() throws JsonParseException, IOException { + @Test + void testParseNoNameDataverse() throws IOException { JsonObject dvJson; try (InputStream jsonFile = ClassLoader.getSystemResourceAsStream("json/no-name-dataverse.json")) { dvJson = Json.createReader(jsonFile).readObject(); - Dataverse actual = sut.parseDataverse(dvJson); + assertThrows(JsonParseException.class, () -> sut.parseDataverse(dvJson)); } } @@ -363,12 +363,12 @@ public void testParseNoNameDataverse() throws JsonParseException, IOException { * @throws JsonParseException if all goes well - this is expected. * @throws IOException when test file IO goes wrong - this is bad. */ - @Test(expected = JsonParseException.class) - public void testParseNoContactEmailsDataverse() throws JsonParseException, IOException { + @Test + void testParseNoContactEmailsDataverse() throws IOException { JsonObject dvJson; try (InputStream jsonFile = ClassLoader.getSystemResourceAsStream("json/no-contacts-dataverse.json")) { dvJson = Json.createReader(jsonFile).readObject(); - Dataverse actual = sut.parseDataverse(dvJson); + assertThrows(JsonParseException.class, () -> sut.parseDataverse(dvJson)); } } @@ -421,16 +421,14 @@ public void testDateTimeRoundtrip() throws ParseException { * Expect an exception when the dataset JSON is empty. * @throws JsonParseException when the test is broken */ - @Test(expected = NullPointerException.class) - public void testParseEmptyDataset() throws JsonParseException { + @Test + void testParseEmptyDataset() throws JsonParseException { JsonObject dsJson; try (InputStream jsonFile = ClassLoader.getSystemResourceAsStream("json/empty-dataset.json")) { InputStreamReader reader = new InputStreamReader(jsonFile, "UTF-8"); dsJson = Json.createReader(reader).readObject(); System.out.println(dsJson != null); - Dataset actual = sut.parseDataset(dsJson); - assertEquals("10.5072", actual.getAuthority()); - assertEquals("doi", actual.getProtocol()); + assertThrows(NullPointerException.class, () -> sut.parseDataset(dsJson)); } catch (IOException ioe) { throw new JsonParseException("Couldn't read test file", ioe); } @@ -444,13 +442,13 @@ public void testParseEmptyDataset() throws JsonParseException { * @throws IOException when test file IO goes wrong - this is bad. */ @Test - public void testParseOvercompleteDatasetVersion() throws JsonParseException, IOException { + void testParseOvercompleteDatasetVersion() throws IOException { JsonObject dsJson; try (InputStream jsonFile = ClassLoader.getSystemResourceAsStream("json/complete-dataset-version.json")) { InputStreamReader reader = new InputStreamReader(jsonFile, "UTF-8"); dsJson = Json.createReader(reader).readObject(); - System.out.println(dsJson != null); - DatasetVersion actual = sut.parseDatasetVersion(dsJson); + Assumptions.assumeTrue(dsJson != null); + assertDoesNotThrow(() -> sut.parseDatasetVersion(dsJson)); } } @@ -567,31 +565,31 @@ public void testValidRegexMailDomainGroup() throws JsonParseException { assertEquals(test.hashCode(), parsed.hashCode()); } - @Test(expected = JsonParseException.class) - public void testMailDomainGroupMissingName() throws JsonParseException { + @Test + void testMailDomainGroupMissingName() { // given String noname = "{ \"id\": 1, \"alias\": \"test\", \"domains\": [] }"; JsonObject obj = Json.createReader(new StringReader(noname)).readObject(); // when && then - MailDomainGroup parsed = new JsonParser().parseMailDomainGroup(obj); + assertThrows(JsonParseException.class, () -> new JsonParser().parseMailDomainGroup(obj)); } - @Test(expected = JsonParseException.class) - public void testMailDomainGroupMissingDomains() throws JsonParseException { + @Test + void testMailDomainGroupMissingDomains() { // given String noname = "{ \"name\": \"test\", \"alias\": \"test\" }"; JsonObject obj = Json.createReader(new StringReader(noname)).readObject(); // when && then - MailDomainGroup parsed = new JsonParser().parseMailDomainGroup(obj); + assertThrows(JsonParseException.class, () -> new JsonParser().parseMailDomainGroup(obj)); } - @Test(expected = JsonParseException.class) - public void testMailDomainGroupNotEnabledRegexDomains() throws JsonParseException { + @Test + void testMailDomainGroupNotEnabledRegexDomains() { // given String regexNotEnabled = "{ \"id\": 1, \"alias\": \"test\", \"domains\": [\"^foobar\\\\.com\"] }"; JsonObject obj = Json.createReader(new StringReader(regexNotEnabled)).readObject(); // when && then - MailDomainGroup parsed = new JsonParser().parseMailDomainGroup(obj); + assertThrows(JsonParseException.class, () -> new JsonParser().parseMailDomainGroup(obj)); } @Test From 6ddc8dbc5d7f480daec4892d23839f97ffbe8ecc Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Fri, 18 Aug 2023 17:42:56 +0200 Subject: [PATCH 087/173] build(test): switch to static imports for assertions everywhere and simplify where reasonable #9782 --- .../iq/dataverse/api/AuxiliaryFilesIT.java | 10 +++--- .../harvard/iq/dataverse/api/DatasetsIT.java | 4 +-- .../iq/dataverse/api/DownloadFilesIT.java | 32 +++++++++---------- .../edu/harvard/iq/dataverse/api/FilesIT.java | 4 +-- .../iq/dataverse/api/InReviewWorkflowIT.java | 6 ++-- .../edu/harvard/iq/dataverse/api/MoveIT.java | 8 ++--- .../iq/dataverse/api/dto/FieldDTOTest.java | 12 +++---- .../imports/ImportGenericServiceBeanTest.java | 18 +++++------ .../impl/DRSSubmitToArchiveCommandTest.java | 2 +- .../plugins/dta/NewDTAFileReaderTest.java | 4 +-- .../makedatacount/MakeDataCountUtilTest.java | 2 +- .../util/json/DatasetVersionDTOTest.java | 2 +- 12 files changed, 52 insertions(+), 52 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/AuxiliaryFilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/AuxiliaryFilesIT.java index 506a1186194..3c77be56810 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/AuxiliaryFilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/AuxiliaryFilesIT.java @@ -243,29 +243,29 @@ public void testUploadAuxFiles() throws IOException { // Download JSON aux file. Response downloadAuxFileJson = UtilIT.downloadAuxFile(fileId, formatTagJson, formatVersionJson, apiToken); downloadAuxFileJson.then().assertThat().statusCode(OK.getStatusCode()); - Assert.assertEquals("attachment; filename=\"data.tab.dpJson_0.1.json\"", downloadAuxFileJson.header("Content-disposition")); + assertEquals("attachment; filename=\"data.tab.dpJson_0.1.json\"", downloadAuxFileJson.header("Content-disposition")); // Download XML aux file. Response downloadAuxFileXml = UtilIT.downloadAuxFile(fileId, formatTagXml, formatVersionXml, apiToken); downloadAuxFileXml.then().assertThat().statusCode(OK.getStatusCode()); - Assert.assertEquals("attachment; filename=\"data.tab.dpXml_0.1.xml\"", downloadAuxFileXml.header("Content-disposition")); + assertEquals("attachment; filename=\"data.tab.dpXml_0.1.xml\"", downloadAuxFileXml.header("Content-disposition")); // Download PDF aux file. Response downloadAuxFilePdf = UtilIT.downloadAuxFile(fileId, formatTagPdf, formatVersionPdf, apiToken); downloadAuxFilePdf.then().assertThat().statusCode(OK.getStatusCode()); - Assert.assertEquals("attachment; filename=\"data.tab.dpPdf_0.1.pdf\"", downloadAuxFilePdf.header("Content-disposition")); + assertEquals("attachment; filename=\"data.tab.dpPdf_0.1.pdf\"", downloadAuxFilePdf.header("Content-disposition")); // Download Markdown aux file. Response downloadAuxFileMd = UtilIT.downloadAuxFile(fileId, formatTagMd, formatVersionMd, apiToken); downloadAuxFileMd.then().assertThat().statusCode(OK.getStatusCode()); // No file extenstion here because Tika's getDefaultMimeTypes doesn't include "text/markdown". // Note: browsers seem to add ".bin" ("myfile.bin") rather than no extension ("myfile"). - Assert.assertEquals("attachment; filename=\"data.tab.README_0.1\"", downloadAuxFileMd.header("Content-disposition")); + assertEquals("attachment; filename=\"data.tab.README_0.1\"", downloadAuxFileMd.header("Content-disposition")); // Download Markdown aux file with no MIME type given Response downloadAuxFileNoMime1 = UtilIT.downloadAuxFile(fileId, formatTagNoMimeType1, formatVersionNoMimeType1, apiToken); downloadAuxFileNoMime1.then().assertThat().statusCode(OK.getStatusCode()); - Assert.assertEquals("attachment; filename=\"data.tab.noMimeType1_0.1.txt\"", downloadAuxFileNoMime1.header("Content-disposition")); + assertEquals("attachment; filename=\"data.tab.noMimeType1_0.1.txt\"", downloadAuxFileNoMime1.header("Content-disposition")); Response createUserNoPrivs = UtilIT.createRandomUser(); createUserNoPrivs.then().assertThat().statusCode(OK.getStatusCode()); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java index 44965c27a3d..990bac7cfe0 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java @@ -2407,7 +2407,7 @@ public void testRestrictFileExportDdi() throws IOException { // Here we are asserting that dataDscr is empty. TODO: Do this in REST Assured. String dataDscrForGuest = XmlPath.from(exportByGuest.asString()).getString("codeBook.dataDscr"); - Assert.assertEquals("", dataDscrForGuest); + assertEquals("", dataDscrForGuest); // Author export (has access) Response exportByAuthor = UtilIT.exportDataset(datasetPid, "ddi", authorApiToken); @@ -2418,7 +2418,7 @@ public void testRestrictFileExportDdi() throws IOException { // Here we are asserting that dataDscr is empty. TODO: Do this in REST Assured. String dataDscrForAuthor = XmlPath.from(exportByAuthor.asString()).getString("codeBook.dataDscr"); - Assert.assertEquals("", dataDscrForAuthor); + assertEquals("", dataDscrForAuthor); // Now we are testing file-level retrieval. // The author has access to a restricted file and gets all the metadata. diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DownloadFilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DownloadFilesIT.java index 7fcf7489d1d..0ce93da2666 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DownloadFilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DownloadFilesIT.java @@ -90,7 +90,7 @@ public void downloadAllFilesByVersion() throws IOException { // Note that a MANIFEST.TXT file is added. HashSet expectedFiles1 = new HashSet<>(Arrays.asList("MANIFEST.TXT", "README.md", "CONTRIBUTING.md")); - Assert.assertEquals(expectedFiles1, filenamesFound1); + assertEquals(expectedFiles1, filenamesFound1); // A guest user can't download unpublished files. // (a guest user cannot even see that the draft version actually exists; @@ -130,7 +130,7 @@ public void downloadAllFilesByVersion() throws IOException { // The creator gets the draft version with an extra file. HashSet expectedFiles2 = new HashSet<>(Arrays.asList("LICENSE.md", "MANIFEST.TXT", "README.md", "CONTRIBUTING.md")); - Assert.assertEquals(expectedFiles2, filenamesFound2); + assertEquals(expectedFiles2, filenamesFound2); Response downloadFiles5 = UtilIT.downloadFiles(datasetPid, null); downloadFiles5.then().assertThat() @@ -140,7 +140,7 @@ public void downloadAllFilesByVersion() throws IOException { // A guest user gets the 1.0 version with only 3 files. HashSet expectedFiles3 = new HashSet<>(Arrays.asList("MANIFEST.TXT", "README.md", "CONTRIBUTING.md")); - Assert.assertEquals(expectedFiles3, filenamesFound3); + assertEquals(expectedFiles3, filenamesFound3); // Publishing version 2.0 UtilIT.publishDatasetViaNativeApi(datasetPid, "major", apiToken) @@ -154,7 +154,7 @@ public void downloadAllFilesByVersion() throws IOException { // By not specifying a version, the creator gets the latest version. In this case, 2.0 (published) with 4 files. HashSet expectedFiles4 = new HashSet<>(Arrays.asList("LICENSE.md", "MANIFEST.TXT", "README.md", "CONTRIBUTING.md")); - Assert.assertEquals(expectedFiles4, filenamesFound4); + assertEquals(expectedFiles4, filenamesFound4); String datasetVersion = "1.0"; Response downloadFiles7 = UtilIT.downloadFiles(datasetPid, datasetVersion, apiToken); @@ -165,7 +165,7 @@ public void downloadAllFilesByVersion() throws IOException { // Creator specifies the 1.0 version and gets the expected 3 files. HashSet expectedFiles5 = new HashSet<>(Arrays.asList("MANIFEST.TXT", "README.md", "CONTRIBUTING.md")); - Assert.assertEquals(expectedFiles5, filenamesFound5); + assertEquals(expectedFiles5, filenamesFound5); // Add Code of Conduct file Path pathtoCocFile = Paths.get(Files.createTempDirectory(null) + File.separator + "CODE_OF_CONDUCT.md"); @@ -186,7 +186,7 @@ public void downloadAllFilesByVersion() throws IOException { // If the creator doesn't specify a version, they get the latest draft with 5 files. HashSet expectedFiles6 = new HashSet<>(Arrays.asList("CODE_OF_CONDUCT.md", "LICENSE.md", "MANIFEST.TXT", "README.md", "CONTRIBUTING.md")); - Assert.assertEquals(expectedFiles6, filenamesFound6); + assertEquals(expectedFiles6, filenamesFound6); String datasetVersionLatestPublished = ":latest-published"; Response downloadFiles9 = UtilIT.downloadFiles(datasetPid, datasetVersionLatestPublished, apiToken); @@ -197,7 +197,7 @@ public void downloadAllFilesByVersion() throws IOException { // The contributor requested "latest published" and got version 3 with 4 files. HashSet expectedFiles7 = new HashSet<>(Arrays.asList("LICENSE.md", "MANIFEST.TXT", "README.md", "CONTRIBUTING.md")); - Assert.assertEquals(expectedFiles7, filenamesFound7); + assertEquals(expectedFiles7, filenamesFound7); // Guests cannot download draft versions. String datasetVersionDraft = ":draft"; @@ -266,14 +266,14 @@ public void downloadAllFilesRestricted() throws IOException { .statusCode(OK.getStatusCode()); // The creator can download a restricted file from a draft. - Assert.assertEquals(new HashSet<>(Arrays.asList("secrets.md", "MANIFEST.TXT")), gatherFilenames(downloadFiles1.getBody().asInputStream())); + assertEquals(new HashSet<>(Arrays.asList("secrets.md", "MANIFEST.TXT")), gatherFilenames(downloadFiles1.getBody().asInputStream())); Response downloadFiles2 = UtilIT.downloadFiles(datasetPid, apiToken); downloadFiles2.then().assertThat() .statusCode(OK.getStatusCode()); // The creator can download a restricted file and an unrestricted file from a draft. - Assert.assertEquals(new HashSet<>(Arrays.asList("secrets.md", "MANIFEST.TXT")), gatherFilenames(downloadFiles2.getBody().asInputStream())); + assertEquals(new HashSet<>(Arrays.asList("secrets.md", "MANIFEST.TXT")), gatherFilenames(downloadFiles2.getBody().asInputStream())); UtilIT.publishDataverseViaNativeApi(dataverseAlias, apiToken) .then().assertThat().statusCode(OK.getStatusCode()); @@ -307,14 +307,14 @@ public void downloadAllFilesRestricted() throws IOException { .statusCode(OK.getStatusCode()); // The guest can only get the unrestricted file (and the manifest). - Assert.assertEquals(new HashSet<>(Arrays.asList("README.md", "MANIFEST.TXT")), gatherFilenames(downloadFiles4.getBody().asInputStream())); + assertEquals(new HashSet<>(Arrays.asList("README.md", "MANIFEST.TXT")), gatherFilenames(downloadFiles4.getBody().asInputStream())); Response downloadFiles5 = UtilIT.downloadFiles(datasetPid, apiToken); downloadFiles5.then().assertThat() .statusCode(OK.getStatusCode()); // The creator can download both files (and the manifest). - Assert.assertEquals(new HashSet<>(Arrays.asList("secrets.md", "README.md", "MANIFEST.TXT")), gatherFilenames(downloadFiles5.getBody().asInputStream())); + assertEquals(new HashSet<>(Arrays.asList("secrets.md", "README.md", "MANIFEST.TXT")), gatherFilenames(downloadFiles5.getBody().asInputStream())); } @@ -363,14 +363,14 @@ public void downloadAllFilesTabular() throws IOException { .statusCode(OK.getStatusCode()); // By default we get the archival version (.tab). - Assert.assertEquals(new HashSet<>(Arrays.asList("50by1000.tab", "MANIFEST.TXT")), gatherFilenames(downloadFiles1.getBody().asInputStream())); + assertEquals(new HashSet<>(Arrays.asList("50by1000.tab", "MANIFEST.TXT")), gatherFilenames(downloadFiles1.getBody().asInputStream())); Response downloadFiles2 = UtilIT.downloadFiles(datasetPid, UtilIT.DownloadFormat.original, apiToken); downloadFiles2.then().assertThat() .statusCode(OK.getStatusCode()); // By passing format=original we get the original version, Stata (.dta) in this case. - Assert.assertEquals(new HashSet<>(Arrays.asList("50by1000.dta", "MANIFEST.TXT")), gatherFilenames(downloadFiles2.getBody().asInputStream())); + assertEquals(new HashSet<>(Arrays.asList("50by1000.dta", "MANIFEST.TXT")), gatherFilenames(downloadFiles2.getBody().asInputStream())); } /** @@ -437,8 +437,8 @@ public void downloadFilenameUtf8() throws IOException { .statusCode(OK.getStatusCode()); Headers headers = downloadFile.getHeaders(); // In "MY READ–ME.md" below the space is %20 and the en-dash ("–") is "%E2%80%93" (e2 80 93 in hex). - Assert.assertEquals("attachment; filename=\"MY%20READ%E2%80%93ME.md\"", headers.getValue("Content-disposition")); - Assert.assertEquals("text/markdown; name=\"MY%20READ%E2%80%93ME.md\";charset=UTF-8", headers.getValue("Content-Type")); + assertEquals("attachment; filename=\"MY%20READ%E2%80%93ME.md\"", headers.getValue("Content-disposition")); + assertEquals("text/markdown; name=\"MY%20READ%E2%80%93ME.md\";charset=UTF-8", headers.getValue("Content-Type")); // Download all files as a zip and assert "MY READ–ME.md" has an en-dash. Response downloadFiles = UtilIT.downloadFiles(datasetPid, apiToken); @@ -450,7 +450,7 @@ public void downloadFilenameUtf8() throws IOException { // Note that a MANIFEST.TXT file is added. // "MY READ–ME.md" (with an en-dash) is correctly extracted from the downloaded zip HashSet expectedFiles = new HashSet<>(Arrays.asList("MANIFEST.TXT", "MY READ–ME.md")); - Assert.assertEquals(expectedFiles, filenamesFound); + assertEquals(expectedFiles, filenamesFound); } private HashSet gatherFilenames(InputStream inputStream) throws IOException { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java index 3463e99412b..0e7ae69688d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java @@ -2092,8 +2092,8 @@ public void testFilePIDsBehavior() { fileInfoResponseString = fileInfoResponse.body().asString(); msg(fileInfoResponseString); - org.junit.Assert.assertEquals("The file was NOT supposed to be issued a PID", "", - JsonPath.from(fileInfoResponseString).getString("data.dataFile.persistentId")); + assertEquals("", JsonPath.from(fileInfoResponseString).getString("data.dataFile.persistentId"), + "The file was NOT supposed to be issued a PID"); } finally { UtilIT.deleteSetting(SettingsServiceBean.Key.FilePIDsEnabled); UtilIT.deleteSetting(SettingsServiceBean.Key.AllowEnablingFilePIDsPerCollection); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/InReviewWorkflowIT.java b/src/test/java/edu/harvard/iq/dataverse/api/InReviewWorkflowIT.java index f50743b582f..736aadd9931 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/InReviewWorkflowIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/InReviewWorkflowIT.java @@ -168,7 +168,7 @@ public void testCuratorSendsCommentsToAuthor() throws InterruptedException { .statusCode(OK.getStatusCode()); String citation = XmlPath.from(atomEntry.body().asString()).getString("bibliographicCitation"); System.out.println("citation: " + citation); - Assert.assertTrue(citation.contains("A Better Title")); + assertTrue(citation.contains("A Better Title")); // The author tries to update the title while the dataset is in review via native. String pathToJsonFile = "doc/sphinx-guides/source/_static/api/dataset-update-metadata.json"; @@ -184,7 +184,7 @@ public void testCuratorSendsCommentsToAuthor() throws InterruptedException { String citationAuthorNative = XmlPath.from(atomEntryAuthorNative.body().asString()).getString("bibliographicCitation"); System.out.println("citation: " + citationAuthorNative); // The author was unable to change the title. - Assert.assertTrue(citationAuthorNative.contains("A Better Title")); + assertTrue(citationAuthorNative.contains("A Better Title")); // The author remembers she forgot to add a file and tries to upload it while // the dataset is in review via native API but this fails. @@ -271,7 +271,7 @@ public void testCuratorSendsCommentsToAuthor() throws InterruptedException { .statusCode(OK.getStatusCode()); String citationCuratorNative = XmlPath.from(atomEntryCuratorNative.body().asString()).getString("bibliographicCitation"); System.out.println("citation: " + citationCuratorNative); - Assert.assertTrue(citationCuratorNative.contains("newTitle")); + assertTrue(citationCuratorNative.contains("newTitle")); // END https://github.com/IQSS/dataverse/issues/4139 // TODO: test where curator neglecting to leave a comment. Should fail with "reason for return" required. diff --git a/src/test/java/edu/harvard/iq/dataverse/api/MoveIT.java b/src/test/java/edu/harvard/iq/dataverse/api/MoveIT.java index 229e7fa646d..5ef7c210bf5 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/MoveIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/MoveIT.java @@ -278,8 +278,8 @@ public void testMoveLinkedDataset() { .body("message", equalTo("Use the query parameter forceMove=true to complete the move. This dataset is linked to the new host dataverse or one of its parents. This move would remove the link to this dataset. ")); JsonObject linksBeforeData = Json.createReader(new StringReader(getLinksBefore.asString())).readObject(); - Assert.assertEquals("OK", linksBeforeData.getString("status")); - Assert.assertEquals(dataverse2Alias + " (id " + dataverse2Id + ")", linksBeforeData.getJsonObject("data").getJsonArray("dataverses that link to dataset id " + datasetId).getString(0)); + assertEquals("OK", linksBeforeData.getString("status")); + assertEquals(dataverse2Alias + " (id " + dataverse2Id + ")", linksBeforeData.getJsonObject("data").getJsonArray("dataverses that link to dataset id " + datasetId).getString(0)); boolean forceMove = true; Response forceMoveLinkedDataset = UtilIT.moveDataset(datasetId.toString(), dataverse2Alias, forceMove, superuserApiToken); @@ -307,8 +307,8 @@ public void testMoveLinkedDataset() { .statusCode(OK.getStatusCode()); JsonObject linksAfterData = Json.createReader(new StringReader(getLinksAfter.asString())).readObject(); - Assert.assertEquals("OK", linksAfterData.getString("status")); - Assert.assertEquals(0, linksAfterData.getJsonObject("data").getJsonArray("dataverses that link to dataset id " + datasetId).size()); + assertEquals("OK", linksAfterData.getString("status")); + assertEquals(0, linksAfterData.getJsonObject("data").getJsonArray("dataverses that link to dataset id " + datasetId).size()); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/dto/FieldDTOTest.java b/src/test/java/edu/harvard/iq/dataverse/api/dto/FieldDTOTest.java index 4f75669eb05..0202f11d469 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/dto/FieldDTOTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/dto/FieldDTOTest.java @@ -60,7 +60,7 @@ public void tearDown() { public void testSinglePrimitive() { FieldDTO affil = FieldDTO.createPrimitiveFieldDTO("authorAffiliation", "Top"); System.out.println(affil.getSinglePrimitive()); - Assert.assertEquals("Top", affil.getSinglePrimitive()); + assertEquals("Top", affil.getSinglePrimitive()); } @@ -78,10 +78,10 @@ public void testMultipleVocab() { value.add("EventList"); astroType.setMultipleVocab(value); - Assert.assertEquals(value, astroType.getMultipleVocab()); + assertEquals(value, astroType.getMultipleVocab()); String jsonStr = gson.toJson(astroType); FieldDTO astroType2 = gson.fromJson(jsonStr, FieldDTO.class); - Assert.assertEquals(astroType, astroType2); + assertEquals(astroType, astroType2); } @@ -116,7 +116,7 @@ public void testSetMultipleCompound() { compoundField.setTypeName("author"); compoundField.setMultipleCompound(authorList); - Assert.assertEquals(compoundField.getMultipleCompound(), authorList); + assertEquals(compoundField.getMultipleCompound(), authorList); } /** @@ -132,8 +132,8 @@ public void testSetSingleCompound() { FieldDTO compoundField = new FieldDTO(); compoundField.setSingleCompound(authorFields.toArray(new FieldDTO[]{})); - Set returned = compoundField.getSingleCompound(); - Assert.assertTrue(returned.equals(authorFields)); + Set returned = compoundField.getSingleCompound(); + assertEquals(returned, authorFields); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/imports/ImportGenericServiceBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/api/imports/ImportGenericServiceBeanTest.java index 3e7d8407de5..44739f3f62a 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/imports/ImportGenericServiceBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/imports/ImportGenericServiceBeanTest.java @@ -17,18 +17,18 @@ public class ImportGenericServiceBeanTest { @Test public void testReassignIdentifierAsGlobalId() { // non-URL - Assert.assertEquals("doi:10.7910/DVN/TJCLKP", importGenericService.reassignIdentifierAsGlobalId("doi:10.7910/DVN/TJCLKP", new DatasetDTO())); - Assert.assertEquals("hdl:10.7910/DVN/TJCLKP", importGenericService.reassignIdentifierAsGlobalId("hdl:10.7910/DVN/TJCLKP", new DatasetDTO())); + assertEquals("doi:10.7910/DVN/TJCLKP", importGenericService.reassignIdentifierAsGlobalId("doi:10.7910/DVN/TJCLKP", new DatasetDTO())); + assertEquals("hdl:10.7910/DVN/TJCLKP", importGenericService.reassignIdentifierAsGlobalId("hdl:10.7910/DVN/TJCLKP", new DatasetDTO())); // HTTPS - Assert.assertEquals("doi:10.7910/DVN/TJCLKP", importGenericService.reassignIdentifierAsGlobalId("https://doi.org/10.7910/DVN/TJCLKP", new DatasetDTO())); - Assert.assertEquals("doi:10.7910/DVN/TJCLKP", importGenericService.reassignIdentifierAsGlobalId("https://dx.doi.org/10.7910/DVN/TJCLKP", new DatasetDTO())); - Assert.assertEquals("hdl:10.7910/DVN/TJCLKP", importGenericService.reassignIdentifierAsGlobalId("https://hdl.handle.net/10.7910/DVN/TJCLKP", new DatasetDTO())); + assertEquals("doi:10.7910/DVN/TJCLKP", importGenericService.reassignIdentifierAsGlobalId("https://doi.org/10.7910/DVN/TJCLKP", new DatasetDTO())); + assertEquals("doi:10.7910/DVN/TJCLKP", importGenericService.reassignIdentifierAsGlobalId("https://dx.doi.org/10.7910/DVN/TJCLKP", new DatasetDTO())); + assertEquals("hdl:10.7910/DVN/TJCLKP", importGenericService.reassignIdentifierAsGlobalId("https://hdl.handle.net/10.7910/DVN/TJCLKP", new DatasetDTO())); // HTTP (no S) - Assert.assertEquals("doi:10.7910/DVN/TJCLKP", importGenericService.reassignIdentifierAsGlobalId("http://doi.org/10.7910/DVN/TJCLKP", new DatasetDTO())); - Assert.assertEquals("doi:10.7910/DVN/TJCLKP", importGenericService.reassignIdentifierAsGlobalId("http://dx.doi.org/10.7910/DVN/TJCLKP", new DatasetDTO())); - Assert.assertEquals("hdl:10.7910/DVN/TJCLKP", importGenericService.reassignIdentifierAsGlobalId("http://hdl.handle.net/10.7910/DVN/TJCLKP", new DatasetDTO())); + assertEquals("doi:10.7910/DVN/TJCLKP", importGenericService.reassignIdentifierAsGlobalId("http://doi.org/10.7910/DVN/TJCLKP", new DatasetDTO())); + assertEquals("doi:10.7910/DVN/TJCLKP", importGenericService.reassignIdentifierAsGlobalId("http://dx.doi.org/10.7910/DVN/TJCLKP", new DatasetDTO())); + assertEquals("hdl:10.7910/DVN/TJCLKP", importGenericService.reassignIdentifierAsGlobalId("http://hdl.handle.net/10.7910/DVN/TJCLKP", new DatasetDTO())); // junk - Assert.assertEquals(null, importGenericService.reassignIdentifierAsGlobalId("junk", new DatasetDTO())); + assertNull(importGenericService.reassignIdentifierAsGlobalId("junk", new DatasetDTO())); } } diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/DRSSubmitToArchiveCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/DRSSubmitToArchiveCommandTest.java index d91384557fb..70e65bfe34c 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/DRSSubmitToArchiveCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/DRSSubmitToArchiveCommandTest.java @@ -114,7 +114,7 @@ public void createJWT() throws CommandException { System.out.println(e.getClass() + e.getLocalizedMessage()); e.printStackTrace(); //Any exception is a failure, otherwise decoding worked. - Assert.fail(e.getLocalizedMessage()); + fail(e.getLocalizedMessage()); } } diff --git a/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/dta/NewDTAFileReaderTest.java b/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/dta/NewDTAFileReaderTest.java index 4a1acdfa607..c963346b05e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/dta/NewDTAFileReaderTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/dta/NewDTAFileReaderTest.java @@ -48,7 +48,7 @@ public void testStrl() throws IOException { String[] vars = {"make","price","mpg","rep78","trunk","gear_ratio","strls"}; String[] actualVars = table.getDataVariables().stream().map((var) -> var.getName()).toArray(String[]::new); - Assert.assertArrayEquals(vars, actualVars); + assertArrayEquals(vars, actualVars); String expected = "\"Buick LeSabre\" 5788 1.1111111111111111E21 100 32767 2.73 \"a\"\n" + "\"Buick Opel\" 4453 26.0 10 2.87 \"bb\"\n" + "\"Buick Regal\" 5189 20.0 3 16 2.93 \"ccc\"\n"; @@ -66,7 +66,7 @@ public void testDates() throws IOException { assertEquals(4, (long)table.getCaseQuantity()); String[] vars = {"Clock","Daily","Weekly","Monthly","Quarterly","BiAnnually","Annually"}; String[] actualVars = table.getDataVariables().stream().map((var) -> var.getName()).toArray(String[]::new); - Assert.assertArrayEquals(vars, actualVars); + assertArrayEquals(vars, actualVars); String expected = "2595-09-27 06:58:52.032 2018-06-20 2018-11-05 2018-06-01 2018-01-01 2018-01-01 2018\n" + "2595-09-27 06:58:52.032 2018-06-20 2018-11-05 2018-06-01 2018-04-01 2018-01-01 2018\n" + "2595-09-27 06:58:52.032 2018-06-20 2018-11-05 2018-06-01 2018-07-01 2018-07-01 2018\n" + diff --git a/src/test/java/edu/harvard/iq/dataverse/makedatacount/MakeDataCountUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/makedatacount/MakeDataCountUtilTest.java index 5a0ad3d8754..56e786714b6 100644 --- a/src/test/java/edu/harvard/iq/dataverse/makedatacount/MakeDataCountUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/makedatacount/MakeDataCountUtilTest.java @@ -31,7 +31,7 @@ public void testParseCitations() { try (FileReader reader = new FileReader("src/test/java/edu/harvard/iq/dataverse/makedatacount/citations-for-doi-10.7910-DVN-HQZOOB.json")) { report = Json.createReader(reader).readObject(); List datasetExternalCitations = MakeDataCountUtil.parseCitations(report); - Assert.assertEquals(2, datasetExternalCitations.size()); + assertEquals(2, datasetExternalCitations.size()); } catch (FileNotFoundException ex) { System.out.print("File not found: " + ex.getMessage()); } catch (IOException ex) { diff --git a/src/test/java/edu/harvard/iq/dataverse/util/json/DatasetVersionDTOTest.java b/src/test/java/edu/harvard/iq/dataverse/util/json/DatasetVersionDTOTest.java index 9ee2a7717dd..7dd5ad9da8d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/json/DatasetVersionDTOTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/json/DatasetVersionDTOTest.java @@ -89,7 +89,7 @@ public void testReadDataSet() { JsonElement expected = gson.toJsonTree(expectedDTO, FieldDTO.class); JsonElement result = gson.toJsonTree(authorDTO); - Assert.assertEquals(expected, result); + assertEquals(expected, result); } catch (IOException e) { e.printStackTrace(); From d2044f132c5c146c4d577b5497d8b11c32d700ef Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Fri, 18 Aug 2023 17:46:16 +0200 Subject: [PATCH 088/173] build(test): migrate JUnit4 parameterized tests and theories to JUnit5 ParameterizedTest #9782 --- .../iq/dataverse/DatasetAuthorTest.java | 42 ++--- .../FileDirectoryNameValidatorTest.java | 37 ++--- .../dataverse/authorization/AuthUtilTest.java | 99 +++++------- .../providers/shib/ShibUtilTest.java | 74 +++------ .../confirmemail/ConfirmEmailUtilTest.java | 68 +++----- .../iq/dataverse/metrics/MetricsUtilTest.java | 52 ++---- .../iq/dataverse/mydata/MyDataUtilTest.java | 80 +++++----- .../mydata/SolrQueryFormatterTest.java | 125 ++++++++++----- .../passwordreset/PasswordValidatorTest.java | 85 ++++------ .../iq/dataverse/util/FileUtilTest.java | 151 +++++++----------- .../iq/dataverse/util/JsfHelperTest.java | 30 ++-- .../iq/dataverse/util/StringUtilTest.java | 107 +++++-------- .../validation/PasswordValidatorUtilTest.java | 107 ++++--------- 13 files changed, 439 insertions(+), 618 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetAuthorTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetAuthorTest.java index 78dacf08166..fa225de18ba 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetAuthorTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetAuthorTest.java @@ -7,34 +7,20 @@ public class DatasetAuthorTest { - public String idType; - public String idValue; - public String expectedIdentifierAsUrl; - - public DatasetAuthorTest(String idType, String idValue, String expectedIdentifierAsUrl) { - this.idType = idType; - this.idValue = idValue; - this.expectedIdentifierAsUrl = expectedIdentifierAsUrl; - } - - @Parameters - public static Collection parameters() { - return Arrays.asList(new String[][] { - { "ORCID", "0000-0002-1825-0097", "https://orcid.org/0000-0002-1825-0097" }, - { "ISNI", "0000000121032683", "http://www.isni.org/isni/0000000121032683"}, - { "LCNA", "n82058243", "http://id.loc.gov/authorities/names/n82058243" }, - { "VIAF", "172389567", "https://viaf.org/viaf/172389567" }, - { "GND", "4079154-3", "https://d-nb.info/gnd/4079154-3" }, - { "ResearcherID", "634082", "https://publons.com/researcher/634082/" }, - { "ResearcherID", "AAW-9289-2021", "https://publons.com/researcher/AAW-9289-2021/" }, - { "ResearcherID", "J-9733-2013", "https://publons.com/researcher/J-9733-2013/" }, - { "ScopusID", "6602344670", "https://www.scopus.com/authid/detail.uri?authorId=6602344670" }, - { null, null, null, }, - }); - } - - @Test - public void getIdentifierAsUrl() { + @ParameterizedTest + @CsvSource(value = { + "ORCID,0000-0002-1825-0097,https://orcid.org/0000-0002-1825-0097", + "ISNI,0000000121032683,http://www.isni.org/isni/0000000121032683", + "LCNA,n82058243,http://id.loc.gov/authorities/names/n82058243", + "VIAF,172389567,https://viaf.org/viaf/172389567", + "GND,4079154-3,https://d-nb.info/gnd/4079154-3", + "ResearcherID,634082,https://publons.com/researcher/634082/", + "ResearcherID,AAW-9289-2021,https://publons.com/researcher/AAW-9289-2021/", + "ResearcherID,J-9733-2013,https://publons.com/researcher/J-9733-2013/", + "ScopusID,6602344670,https://www.scopus.com/authid/detail.uri?authorId=6602344670", + "NULL,NULL,NULL" + }, nullValues = "NULL") + void getIdentifierAsUrl(String idType, String idValue, String expectedIdentifierAsUrl) { DatasetAuthor datasetAuthor = new DatasetAuthor(); if (idType !=null && idValue != null) { datasetAuthor.setIdType(idType); diff --git a/src/test/java/edu/harvard/iq/dataverse/FileDirectoryNameValidatorTest.java b/src/test/java/edu/harvard/iq/dataverse/FileDirectoryNameValidatorTest.java index c8d6a8cd747..5ff74aea603 100644 --- a/src/test/java/edu/harvard/iq/dataverse/FileDirectoryNameValidatorTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/FileDirectoryNameValidatorTest.java @@ -7,30 +7,19 @@ public class FileDirectoryNameValidatorTest { - public boolean isValid; - public String fileDirectoryName; - - public FileDirectoryNameValidatorTest(boolean isValid, String fileDirectoryName) { - this.isValid = isValid; - this.fileDirectoryName = fileDirectoryName; - } - - @Parameterized.Parameters - public static Collection parameters() { - return Arrays.asList(new Object[][]{ - {true, "foobar"}, - // The leading "-" gets stripped. - {true, "-foobar"}, - {true, "_foobar"}, - {true, "foobar_"}, - {true, "folder/sub"}, - {true, "folder///sub"}, - {true, "folder///sub/third"}, - {false, "f**bar"},}); - } - - @Test - public void testIsFileDirectoryNameValid() { + @ParameterizedTest + @CsvSource({ + "true,foobar", + // The leading "-" gets stripped. + "true,-foobar", + "true,_foobar", + "true,foobar_", + "true,folder/sub", + "true,folder///sub", + "true,folder///sub/third", + "false,f**bar" + }) + public void testIsFileDirectoryNameValid(boolean isValid, String fileDirectoryName) { assertEquals(isValid, FileDirectoryNameValidator.isFileDirectoryNameValid(fileDirectoryName, null)); } diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/AuthUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/AuthUtilTest.java index 66c7fbbbc70..74f6d714a5e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/AuthUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/AuthUtilTest.java @@ -17,68 +17,45 @@ import static org.junit.jupiter.api.Assertions.assertTrue; public class AuthUtilTest { - - @RunWith(Parameterized.class) - public static class AuthUtilParamTests { - - @Parameters - public static Collection data() { - return Arrays.asList( - new String[][] { - { null, null, null }, - { "Homer", "Homer", null }, - { "Simpson", null, "Simpson" }, - { "Homer Simpson", "Homer", "Simpson" }, - { "Homer Simpson", " Homer", "Simpson" } - } - ); - } - - @Parameter - public String expectedDisplayName; - - @Parameter(1) - public String displayFirst; - - @Parameter(2) - public String displayLast; - - @Test - public void testGetDisplayName() { - assertEquals(expectedDisplayName, AuthUtil.getDisplayName(displayFirst, displayLast)); - } + + @ParameterizedTest + @CsvSource(value = { + "NULL,NULL,NULL", + "Homer,Homer,NULL", + "Simpson,NULL,Simpson", + "Homer Simpson,Homer,Simpson", + "Homer Simpson,Homer,Simpson" + }, nullValues = "NULL") + void testGetDisplayName(String expectedDisplayName, String displayFirst, String displayLast) { + assertEquals(expectedDisplayName, AuthUtil.getDisplayName(displayFirst, displayLast)); } - - public static class AuthUtilNoParamTests { - - /** - * Test of isNonLocalLoginEnabled method, of class AuthUtil. - */ - @Test - public void testIsNonLocalLoginEnabled() { - System.out.println("isNonLocalLoginEnabled"); - - AuthUtil authUtil = new AuthUtil(); - - assertEquals(false, AuthUtil.isNonLocalLoginEnabled(null)); - - Collection shibOnly = new HashSet<>(); - shibOnly.add(new ShibAuthenticationProvider()); - assertEquals(true, AuthUtil.isNonLocalLoginEnabled(shibOnly)); - - Collection manyNonLocal = new HashSet<>(); - manyNonLocal.add(new ShibAuthenticationProvider()); - manyNonLocal.add(new GitHubOAuth2AP(null, null)); - manyNonLocal.add(new GoogleOAuth2AP(null, null)); - manyNonLocal.add(new OrcidOAuth2AP(null, null, null)); - assertEquals(true, AuthUtil.isNonLocalLoginEnabled(manyNonLocal)); - - Collection onlyBuiltin = new HashSet<>(); - onlyBuiltin.add(new BuiltinAuthenticationProvider(null, null, null)); - // only builtin provider - assertEquals(false, AuthUtil.isNonLocalLoginEnabled(onlyBuiltin)); - - } + + /** + * Test of isNonLocalLoginEnabled method, of class AuthUtil. + */ + @Test + public void testIsNonLocalLoginEnabled() { + System.out.println("isNonLocalLoginEnabled"); + + AuthUtil authUtil = new AuthUtil(); + + assertFalse(AuthUtil.isNonLocalLoginEnabled(null)); + + Collection shibOnly = new HashSet<>(); + shibOnly.add(new ShibAuthenticationProvider()); + assertTrue(AuthUtil.isNonLocalLoginEnabled(shibOnly)); + + Collection manyNonLocal = new HashSet<>(); + manyNonLocal.add(new ShibAuthenticationProvider()); + manyNonLocal.add(new GitHubOAuth2AP(null, null)); + manyNonLocal.add(new GoogleOAuth2AP(null, null)); + manyNonLocal.add(new OrcidOAuth2AP(null, null, null)); + assertTrue(AuthUtil.isNonLocalLoginEnabled(manyNonLocal)); + + Collection onlyBuiltin = new HashSet<>(); + onlyBuiltin.add(new BuiltinAuthenticationProvider(null, null, null)); + // only builtin provider + assertFalse(AuthUtil.isNonLocalLoginEnabled(onlyBuiltin)); } } diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibUtilTest.java index c011ad3041d..c644a4e2b2a 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibUtilTest.java @@ -16,55 +16,33 @@ import static org.mockito.Mockito.mock; public class ShibUtilTest { - - @RunWith(Parameterized.class) - public static class ShibUtilParamTest { - - @Parameters - public static Collection data() { - return Arrays.asList(new String[][] { - { "John", "Harvard", "John", "Harvard", null }, - { "Guido", "van Rossum", "Guido", "van Rossum", null }, - { "Philip Seymour", "Hoffman", "Philip Seymour", "Hoffman", "Philip Seymour Hoffman" }, - { "Edward", "Cummings", "Edward;e e", "Cummings", null }, - { "Edward", "Cummings", "Edward;e e", "Cummings", "e e cummings" }, - { "Anthony", "Stark", "Tony;Anthony", "Stark", null }, - { "Anthony", "Stark", "Anthony;Tony", "Stark", null }, - { "Antoni", "Gaudí", "Antoni", "Gaudí i Cornet;Gaudí", null }, - { "Jane", "Doe", null, null, "Jane Doe" }, - /** - * @todo Make findBestFirstAndLastName smart enough to know that the last name - * should be "Hoffman" rather than "Seymour". - */ - { "Philip", "Seymour", null, null, "Philip Seymour Hoffman" }, - { null, null, null, null, "" } - }); - } - - @Parameter - public String expectedFirstName; - - @Parameter(1) - public String expectedLastName; - - @Parameter(2) - public String actualFirstName; - - @Parameter(3) - public String actualLastName; - - @Parameter(4) - public String actualDisplayName; - - @Test - public void testFindBestFirstAndLastName() { - - // ShibUserNameFields expected1 = new ShibUserNameFields("John", "Harvard"); - ShibUserNameFields actualValues = ShibUtil.findBestFirstAndLastName(actualFirstName, actualLastName, actualDisplayName); - assertEquals(expectedFirstName, actualValues.getFirstName()); - assertEquals(expectedLastName, actualValues.getLastName()); - } + + @ParameterizedTest + @CsvSource(value = { + "John,Harvard,John,Harvard,NULL", + "Guido,van Rossum,Guido,van Rossum,NULL", + "Philip Seymour,Hoffman,Philip Seymour,Hoffman,Philip Seymour Hoffman", + "Edward,Cummings,Edward;e e,Cummings,NULL", + "Edward,Cummings,Edward;e e,Cummings,e e cummings", + "Anthony,Stark,Tony;Anthony,Stark,NULL", + "Anthony,Stark,Anthony;Tony,Stark,NULL", + "Antoni,Gaudí,Antoni,Gaudí i Cornet;Gaudí,NULL", + "Jane,Doe,NULL,NULL,Jane Doe", + /** + * @todo Make findBestFirstAndLastName smart enough to know that the last name + * should be "Hoffman" rather than "Seymour". + */ + "Philip,Seymour,NULL,NULL,Philip Seymour Hoffman", + "NULL,NULL,NULL,NULL,EMPTY" + }, nullValues = "NULL", emptyValue = "EMPTY") + void testFindBestFirstAndLastName(String expectedFirstName, String expectedLastName, String actualFirstName, + String actualLastName, String actualDisplayName) { + // ShibUserNameFields expected1 = new ShibUserNameFields("John", "Harvard"); + ShibUserNameFields actualValues = ShibUtil.findBestFirstAndLastName(actualFirstName, actualLastName, actualDisplayName); + assertEquals(expectedFirstName, actualValues.getFirstName()); + assertEquals(expectedLastName, actualValues.getLastName()); } + public static class ShibUtilNoParamTest { diff --git a/src/test/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailUtilTest.java index d2ef6a51a84..43795f0114f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/confirmemail/ConfirmEmailUtilTest.java @@ -11,49 +11,31 @@ import static org.junit.jupiter.api.Assertions.assertEquals; public class ConfirmEmailUtilTest { - - @RunWith(Parameterized.class) - public static class ConfirmEmailUtilParamTest { - - public String timeAsFriendlyString; - public int timeInMinutes; - - public ConfirmEmailUtilParamTest(String timeAsFriendlyString, int timeInSeconds) { - this.timeAsFriendlyString = timeAsFriendlyString; - this.timeInMinutes = timeInSeconds; - } - - @Parameters - public static Collection parameters() { - return Arrays.asList( - new Object[][] { - { "48 hours", 2880 }, - { "24 hours", 1440 }, - { "2.75 hours", 165 }, - { "2.5 hours", 150 }, - { "1.5 hours", 90 }, - { "1 hour", 60 }, - { "30 minutes", 30 }, - { "1 minute", 1 } - } - ); - } - - @Test - public void friendlyExpirationTimeTest() { - assertEquals(timeAsFriendlyString, ConfirmEmailUtil.friendlyExpirationTime(timeInMinutes)); - } + + static Stream dataPoints() { + return Stream.of( + Arguments.of("48 hours", 2880), + Arguments.of("24 hours", 1440), + Arguments.of("2.75 hours", 165), + Arguments.of("2.5 hours", 150), + Arguments.of("1.5 hours", 90), + Arguments.of("1 hour", 60), + Arguments.of("30 minutes", 30), + Arguments.of("1 minute", 1) + ); } - - public static class ConfirmEmailUtilNoParamTest { - - @Test - public void testGrandfatheredTime() { - System.out.println(); - System.out.println("Grandfathered account timestamp test"); - System.out.println("Grandfathered Time (y2k): " + ConfirmEmailUtil.getGrandfatheredTime()); - assertEquals(Timestamp.valueOf("2000-01-01 00:00:00.0"), ConfirmEmailUtil.getGrandfatheredTime()); - System.out.println(); - } + + @ParameterizedTest + @MethodSource("dataPoints") + void friendlyExpirationTimeTest(String timeAsFriendlyString, int timeInMinutes) { + assertEquals(timeAsFriendlyString, ConfirmEmailUtil.friendlyExpirationTime(timeInMinutes)); + } + + @Test + void testGrandfatheredTime() { + //System.out.println("Grandfathered account timestamp test"); + //System.out.println("Grandfathered Time (y2k): " + ConfirmEmailUtil.getGrandfatheredTime()); + assertEquals(Timestamp.valueOf("2000-01-01 00:00:00.0"), ConfirmEmailUtil.getGrandfatheredTime()); + //System.out.println(); } } diff --git a/src/test/java/edu/harvard/iq/dataverse/metrics/MetricsUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/metrics/MetricsUtilTest.java index bb42bda68ea..484ce2ebe47 100644 --- a/src/test/java/edu/harvard/iq/dataverse/metrics/MetricsUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/metrics/MetricsUtilTest.java @@ -205,42 +205,20 @@ public void testStringToJsonObjectBuilder() { } } - - @RunWith(Parameterized.class) - public static class ValidateDataLocationStringTypeTest { - @Parameter - public String dataLocation; - - @Parameter(1) - public boolean isExceptionExpected; - - @Parameter(2) - public String expectedOutput; - - @Parameters - public static Collection parameters() { - return Arrays.asList(new Object[][] { - { "local", false, "local" }, - { "remote", false, "remote" }, - { "all", false, "all" }, - { null, false, "local" }, - { "", false, "local" }, - { "abcd", true, null } - }); - } - - @Test - public void testValidateDataLocationStringType() { - try { - assertEquals(expectedOutput, MetricsUtil.validateDataLocationStringType(dataLocation)); - } catch (Exception e) { - if (isExceptionExpected) { - return; - } else { - fail("should not throw an exception!"); - } - } - } - + + @ParameterizedTest + @CsvSource(value = { + "local,false,local", + "remote,false,remote", + "all,false,all", + "NULL,false,local", + "'',false,local", + "abcd,true,NULL" + }, nullValues = "NULL") + void testValidateDataLocationStringType(String dataLocation, boolean isExceptionExpected, String expectedOutput) { + if (isExceptionExpected) + assertThrows(Exception.class, () -> MetricsUtil.validateDataLocationStringType(dataLocation)); + else + assertEquals(expectedOutput, MetricsUtil.validateDataLocationStringType(dataLocation)); } } diff --git a/src/test/java/edu/harvard/iq/dataverse/mydata/MyDataUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/mydata/MyDataUtilTest.java index 111d785f52d..8cf5b0a3f44 100644 --- a/src/test/java/edu/harvard/iq/dataverse/mydata/MyDataUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/mydata/MyDataUtilTest.java @@ -13,64 +13,70 @@ class MyDataUtilTest { - @DataPoints - public static String[] userIdentifier = { - "@nzaugg", "nzaugg@", "nzaugg", "123nzaugg", "", " ", null, "@", "n" }; + static List userIdentifier() { + return List.of("@nzaugg", "nzaugg@", "nzaugg", "123nzaugg", " ", "@", "n"); + } - @Theory - public void testFormatUserIdentifierAsAssigneeIdentifierNull(String userIdentifier) { - assumeTrue(userIdentifier == null); + @ParameterizedTest + @NullSource + void testFormatUserIdentifierAsAssigneeIdentifierNull(String userIdentifier) { String formattedUserIdentifier = MyDataUtil.formatUserIdentifierAsAssigneeIdentifier(userIdentifier); - assertTrue(formattedUserIdentifier == null); + assertNull(formattedUserIdentifier); } - - @Theory - public void testFormatUserIdentifierAsAssigneeIdentifierOneCharString(String userIdentifier) { - assumeTrue(userIdentifier != null); + + @ParameterizedTest + @MethodSource("userIdentifier") + void testFormatUserIdentifierAsAssigneeIdentifierOneCharString(String userIdentifier) { assumeTrue(userIdentifier.startsWith("@")); + String formattedUserIdentifier = MyDataUtil.formatUserIdentifierAsAssigneeIdentifier(userIdentifier); - assertTrue(formattedUserIdentifier.equals(userIdentifier)); + assertEquals(formattedUserIdentifier, userIdentifier); } - - @Theory - public void testFormatUserIdentifierAsAssigneeIdentifier(String userIdentifier) { - assumeTrue(userIdentifier != null); + + @ParameterizedTest + @MethodSource("userIdentifier") + void testFormatUserIdentifierAsAssigneeIdentifier(String userIdentifier) { assumeTrue(!userIdentifier.startsWith("@")); + String formattedUserIdentifier = MyDataUtil.formatUserIdentifierAsAssigneeIdentifier(userIdentifier); - assertTrue(formattedUserIdentifier.equals("@" + userIdentifier)); + assertEquals(formattedUserIdentifier, "@" + userIdentifier); } - - @Theory - public void testFormatUserIdentifierForMyDataFormNull(String userIdentifier) { - assumeTrue(userIdentifier == null); + + @ParameterizedTest + @NullSource + void testFormatUserIdentifierForMyDataFormNull(String userIdentifier) { String formattedUserIdentifier = MyDataUtil.formatUserIdentifierForMyDataForm(userIdentifier); - assertTrue(formattedUserIdentifier == null); + assertNull(formattedUserIdentifier); } - - @Theory - public void testFormatUserIdentifierForMyDataFormOneCharString(String userIdentifier) { - assumeTrue(userIdentifier != null); + + @ParameterizedTest + @MethodSource("userIdentifier") + void testFormatUserIdentifierForMyDataFormOneCharString(String userIdentifier) { assumeTrue(userIdentifier.startsWith("@")); assumeTrue(userIdentifier.length() == 1); + String formattedUserIdentifier = MyDataUtil.formatUserIdentifierForMyDataForm(userIdentifier); - assertTrue(formattedUserIdentifier == null); + assertNull(formattedUserIdentifier); } - - @Theory - public void testFormatUserIdentifierForMyDataFormLongerString(String userIdentifier) { - assumeTrue(userIdentifier != null); + + @ParameterizedTest + @MethodSource("userIdentifier") + void testFormatUserIdentifierForMyDataFormLongerString(String userIdentifier) { assumeTrue(userIdentifier.startsWith("@")); assumeTrue(userIdentifier.length() > 1); + String formattedUserIdentifier = MyDataUtil.formatUserIdentifierForMyDataForm(userIdentifier); - assertTrue(formattedUserIdentifier.equals(userIdentifier.substring(1))); + assertEquals(formattedUserIdentifier, userIdentifier.substring(1)); } - - @Theory - public void testFormatUserIdentifierForMyDataForm(String userIdentifier) { - assumeTrue(userIdentifier != null); + + @ParameterizedTest + @MethodSource("userIdentifier") + @EmptySource + void testFormatUserIdentifierForMyDataForm(String userIdentifier) { assumeTrue(!userIdentifier.startsWith("@")); + String formattedUserIdentifier = MyDataUtil.formatUserIdentifierForMyDataForm(userIdentifier); - assertTrue(formattedUserIdentifier.equals(userIdentifier)); + assertEquals(formattedUserIdentifier, userIdentifier); } } \ No newline at end of file diff --git a/src/test/java/edu/harvard/iq/dataverse/mydata/SolrQueryFormatterTest.java b/src/test/java/edu/harvard/iq/dataverse/mydata/SolrQueryFormatterTest.java index 6f242d67dcf..789204c1db4 100644 --- a/src/test/java/edu/harvard/iq/dataverse/mydata/SolrQueryFormatterTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/mydata/SolrQueryFormatterTest.java @@ -126,28 +126,7 @@ private void msgt(String s){ } } - @RunWith(Parameterized.class) - public static class SolrQueryFormatterParamTest { - - @Parameter(0) - public List sliceOfIds; - - @Parameter(1) - public String paramName; - - @Parameter(2) - public String dvObjectType; - - // may be either - // (i) the expected query part or - // (ii) the expected exception message - @Parameter(3) - public String expectedResult; - - @Parameter(4) - public Class expectedException; - - @Parameters + /* public static Collection data() { // The following list of test cases was compiled using the interface-based approach for input-space partition. // Therefor, for every input parameter, the domain of possible values was partitioned into different sets: @@ -208,24 +187,90 @@ public static Collection data() { { new ArrayList(Arrays.asList(1L, null)), "paramName", "dvObjectType", "(paramName:(1) AND dvObjectType:(dvObjectType))", null }, }); } - - @Test - public void testFormatIdsForSolrClause() { - SolrQueryFormatter sqf = new SolrQueryFormatter(); - - if (expectedException == null) { - assertEquals(expectedResult, sqf.formatIdsForSolrClause(sliceOfIds, paramName, dvObjectType)); - return; - } - - try { - sqf.formatIdsForSolrClause(sliceOfIds, paramName, dvObjectType); - fail("Expected exception (" + expectedException.toString() + ") was not thrown"); - } catch (Exception ex) { - assertEquals("verify the exception class", expectedException, ex.getClass()); - assertEquals("verify the exception message", expectedResult, ex.getMessage()); - } + */ + + /* + * The following list of test cases was compiled using the interface-based approach for input-space partition. + * Therefor, for every input parameter, the domain of possible values was partitioned into different sets: + * - sliceOfIds (5 sets): null, empty, non-empty with null values only, non-empty with Long values only, non-empty with both null and Long values + * - paramName (3 sets): null, empty, non-empty + * - dvObjectType (3 sets): null, empty, non-empty + * Then, for every set, a representative value was chosen and combined with every other set (3*3*5 = 45 test cases). + */ + static Stream data() { + return Stream.of( + // sliceOfIds paramName dvObjectType expectedResult expectedException + Arguments.of(null, null, null, "paramName cannot be null", NullPointerException.class), + Arguments.of(null, null, "", "paramName cannot be null", NullPointerException.class), + Arguments.of(null, null, "dvObjectType", "paramName cannot be null", NullPointerException.class), + Arguments.of(null, "", null, "sliceOfIds cannot be null", NullPointerException.class), + Arguments.of(null, "", "", "sliceOfIds cannot be null", NullPointerException.class), + Arguments.of(null, "", "dvObjectType", "sliceOfIds cannot be null", NullPointerException.class), + Arguments.of(null, "paramName", null, "sliceOfIds cannot be null", NullPointerException.class), + Arguments.of(null, "paramName", "", "sliceOfIds cannot be null", NullPointerException.class), + Arguments.of(null, "paramName", "dvObjectType", "sliceOfIds cannot be null", NullPointerException.class), + + Arguments.of(list(), null, null, "paramName cannot be null", NullPointerException.class), + Arguments.of(list(), null, "", "paramName cannot be null", NullPointerException.class), + Arguments.of(list(), null, "dvObjectType", "paramName cannot be null", NullPointerException.class), + Arguments.of(list(), "", null, "sliceOfIds must have at least 1 value", IllegalStateException.class), + Arguments.of(list(), "", "", "sliceOfIds must have at least 1 value", IllegalStateException.class), + Arguments.of(list(), "", "dvObjectType", "sliceOfIds must have at least 1 value", IllegalStateException.class), + Arguments.of(list(), "paramName", null, "sliceOfIds must have at least 1 value", IllegalStateException.class), + Arguments.of(list(), "paramName", "", "sliceOfIds must have at least 1 value", IllegalStateException.class), + Arguments.of(list(), "paramName", "dvObjectType", "sliceOfIds must have at least 1 value", IllegalStateException.class), + + Arguments.of(list((Long) null), null, null, "paramName cannot be null", NullPointerException.class), + Arguments.of(list((Long) null), null, "", "paramName cannot be null", NullPointerException.class), + Arguments.of(list((Long) null), null, "dvObjectType", "paramName cannot be null", NullPointerException.class), + Arguments.of(list((Long) null), "", null, "(:())", null), + Arguments.of(list((Long) null), "", "", "(:() AND dvObjectType:())", null), + Arguments.of(list((Long) null), "", "dvObjectType", "(:() AND dvObjectType:(dvObjectType))", null), + Arguments.of(list((Long) null), "paramName", null, "(paramName:())", null), + Arguments.of(list((Long) null), "paramName", "", "(paramName:() AND dvObjectType:())", null), + Arguments.of(list((Long) null), "paramName", "dvObjectType", "(paramName:() AND dvObjectType:(dvObjectType))", null), + + Arguments.of(list(1L), null, null, "paramName cannot be null", NullPointerException.class), + Arguments.of(list(1L), null, "", "paramName cannot be null", NullPointerException.class), + Arguments.of(list(1L), null, "dvObjectType", "paramName cannot be null", NullPointerException.class), + Arguments.of(list(1L), "", null, "(:(1))", null), + Arguments.of(list(1L), "", "", "(:(1) AND dvObjectType:())", null), + Arguments.of(list(1L), "", "dvObjectType", "(:(1) AND dvObjectType:(dvObjectType))", null), + Arguments.of(list(1L), "paramName", null, "(paramName:(1))", null), + Arguments.of(list(1L), "paramName", "", "(paramName:(1) AND dvObjectType:())", null), + Arguments.of(list(1L), "paramName", "dvObjectType", "(paramName:(1) AND dvObjectType:(dvObjectType))", null), + + Arguments.of(list(1L, null), null, null, "paramName cannot be null", NullPointerException.class), + Arguments.of(list(1L, null), null, "", "paramName cannot be null", NullPointerException.class), + Arguments.of(list(1L, null), null, "dvObjectType", "paramName cannot be null", NullPointerException.class), + Arguments.of(list(1L, null), "", null, "(:(1))", null), + Arguments.of(list(1L, null), "", "", "(:(1) AND dvObjectType:())", null), + Arguments.of(list(1L, null), "", "dvObjectType", "(:(1) AND dvObjectType:(dvObjectType))", null), + Arguments.of(list(1L, null), "paramName", null, "(paramName:(1))", null), + Arguments.of(list(1L, null), "paramName", "", "(paramName:(1) AND dvObjectType:())", null), + Arguments.of(list(1L, null), "paramName", "dvObjectType", "(paramName:(1) AND dvObjectType:(dvObjectType))", null) + ); + } + + /** + * @param expectedResult May either be (i) the expected query part or (ii) the expected exception message + */ + @ParameterizedTest + @MethodSource("data") + void testFormatIdsForSolrClause(List sliceOfIds, String paramName, String dvObjectType, + String expectedResult, Class expectedException) { + SolrQueryFormatter sqf = new SolrQueryFormatter(); + + if (expectedException == null) { + assertEquals(expectedResult, sqf.formatIdsForSolrClause(sliceOfIds, paramName, dvObjectType)); + return; } - + + Throwable e = assertThrows(expectedException, () -> sqf.formatIdsForSolrClause(sliceOfIds, paramName, dvObjectType)); + assertEquals(expectedResult, e.getMessage()); + } + + static List list(Long... args) { + return Arrays.asList(args); } } diff --git a/src/test/java/edu/harvard/iq/dataverse/passwordreset/PasswordValidatorTest.java b/src/test/java/edu/harvard/iq/dataverse/passwordreset/PasswordValidatorTest.java index 2187ff3235d..c15f7fa95e9 100644 --- a/src/test/java/edu/harvard/iq/dataverse/passwordreset/PasswordValidatorTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/passwordreset/PasswordValidatorTest.java @@ -9,61 +9,42 @@ import org.junit.jupiter.params.provider.MethodSource; public class PasswordValidatorTest { - - public String password; - public boolean expected; - public boolean mustContainSpecialCharacters; - public boolean mustContainCapitalLetters; - public boolean mustContainNumbers; - public int minLength; - public int maxLength; - - public PasswordValidatorTest(String password, boolean expected, boolean mustContainSpecialCharacters, - boolean mustContainCapitalLetters, boolean mustContainNumbers, int minLength, int maxLength) { - this.password = password; - this.expected = expected; - this.mustContainSpecialCharacters = mustContainSpecialCharacters; - this.mustContainCapitalLetters = mustContainCapitalLetters; - this.mustContainNumbers = mustContainNumbers; - this.minLength = minLength; - this.maxLength = maxLength; - } - - @Parameters - public static Collection parameters() { - return Arrays.asList( - new Object[][] { - // Check if PasswordValidator correctly validates correct passwords - // with all combinations of Special Characters, - // Capital Letters and Numbers - {"abcdefghabcdefgh", true, false, false, false, 8, 30}, - {"@bcdefgh@bcdefgh", true, true, false, false, 8, 30}, - {"@bAdefgh@bAdefgh", true, true, true, false, 8, 30}, - {"abAdefghabAdefgh", true, false, true, false, 8, 30}, - {"a1Adefgha1Adefgh", true, false, true, true, 8, 30}, - {"ab1defghab1defgh", true, false, false, true, 8, 30}, - {"@1cdefgh@1cdefgh", true, true, false, true, 8, 30}, - {"@1Adefgh@1Adefgh", true, true, true, true, 8, 30}, - // Check if PasswordValidator correctly rejects wrong passwords - // with all combinations of Special Characters, - // Capital Letters and Numbers - {"abcabc", false, false, false, false, 8, 30}, - {"abcdabcd", false, true, false, false, 8, 30}, - {"@bcd@bcd", false, true, true, false, 8, 30}, - {"@bc1@bc1", false, false, true, false, 8, 30}, - {"a1cda1cd", false, false, true, true, 8, 30}, - {"AbcdAbcd", false, false, false, true, 8, 30}, - {"@Bcd@Bcd", false, true, false, true, 8, 30}, - {"a1Ada1Ad", false, true, true, true, 8, 30}, - {"", false, false, false, false, 1, 30}, - {" ", false, false, false, false, 1, 30}, - {"?!abcdef", false, true, false, false, 8, 30} - } + + static Stream testCases() { + return Stream.of( + // Check if PasswordValidator correctly validates correct passwords + // with all combinations of Special Characters, + // Capital Letters and Numbers + Arguments.of("abcdefghabcdefgh", true, false, false, false, 8, 30), + Arguments.of("@bcdefgh@bcdefgh", true, true, false, false, 8, 30), + Arguments.of("@bAdefgh@bAdefgh", true, true, true, false, 8, 30), + Arguments.of("abAdefghabAdefgh", true, false, true, false, 8, 30), + Arguments.of("a1Adefgha1Adefgh", true, false, true, true, 8, 30), + Arguments.of("ab1defghab1defgh", true, false, false, true, 8, 30), + Arguments.of("@1cdefgh@1cdefgh", true, true, false, true, 8, 30), + Arguments.of("@1Adefgh@1Adefgh", true, true, true, true, 8, 30), + // Check if PasswordValidator correctly rejects wrong passwords + // with all combinations of Special Characters, + // Capital Letters and Numbers + Arguments.of("abcabc", false, false, false, false, 8, 30), + Arguments.of("abcdabcd", false, true, false, false, 8, 30), + Arguments.of("@bcd@bcd", false, true, true, false, 8, 30), + Arguments.of("@bc1@bc1", false, false, true, false, 8, 30), + Arguments.of("a1cda1cd", false, false, true, true, 8, 30), + Arguments.of("AbcdAbcd", false, false, false, true, 8, 30), + Arguments.of("@Bcd@Bcd", false, true, false, true, 8, 30), + Arguments.of("a1Ada1Ad", false, true, true, true, 8, 30), + Arguments.of("", false, false, false, false, 1, 30), + Arguments.of(" ", false, false, false, false, 1, 30), + Arguments.of("?!abcdef", false, true, false, false, 8, 30) ); } - @Test - public void testValidatePassword() { + @ParameterizedTest + @MethodSource("testCases") + void testValidatePassword(String password, boolean expected, boolean mustContainSpecialCharacters, + boolean mustContainCapitalLetters, boolean mustContainNumbers, int minLength, + int maxLength) { PasswordValidator validator = PasswordValidator.buildValidator(mustContainSpecialCharacters, mustContainCapitalLetters, mustContainNumbers, minLength, maxLength); boolean isValidPassword = validator.validatePassword(password); diff --git a/src/test/java/edu/harvard/iq/dataverse/util/FileUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/util/FileUtilTest.java index 956b54a08ef..2cfe9f25d7e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/FileUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/FileUtilTest.java @@ -31,89 +31,60 @@ import static org.junit.jupiter.api.Assertions.fail; public class FileUtilTest { - - @RunWith(Parameterized.class) - public static class FileUtilParamTest { - - @Parameters - public static Collection data() { - return Arrays.asList(new Object[][] { - { null, null, null }, - - { "trees.png-endnote.xml", "trees.png", FileUtil.FileCitationExtension.ENDNOTE }, - { "trees.png.ris", "trees.png", FileUtil.FileCitationExtension.RIS }, - { "trees.png.bib", "trees.png", FileUtil.FileCitationExtension.BIBTEX }, - { null, "trees.png", null }, - - { "50by1000-endnote.xml", "50by1000.tab", FileUtil.FileCitationExtension.ENDNOTE }, - { "50by1000.ris", "50by1000.tab", FileUtil.FileCitationExtension.RIS }, - { "50by1000.bib", "50by1000.tab", FileUtil.FileCitationExtension.BIBTEX } - }); - } - - @Parameter - public String expectedFileName; - - @Parameter(1) - public String actualFileName; - - @Parameter(2) - public FileCitationExtension citationExtension; - - @Test - public void testGetCiteDataFileFilename() { - assertEquals(expectedFileName, FileUtil.getCiteDataFileFilename(actualFileName, citationExtension)); - } + + static Stream dataFilenames() { + return Stream.of( + Arguments.of(null, null, null), + Arguments.of("trees.png-endnote.xml", "trees.png", FileUtil.FileCitationExtension.ENDNOTE), + Arguments.of("trees.png.ris", "trees.png", FileUtil.FileCitationExtension.RIS), + Arguments.of("trees.png.bib", "trees.png", FileUtil.FileCitationExtension.BIBTEX), + Arguments.of(null, "trees.png", null), + Arguments.of("50by1000-endnote.xml", "50by1000.tab", FileUtil.FileCitationExtension.ENDNOTE), + Arguments.of("50by1000.ris", "50by1000.tab", FileUtil.FileCitationExtension.RIS), + Arguments.of("50by1000.bib", "50by1000.tab", FileUtil.FileCitationExtension.BIBTEX) + ); } - - @RunWith(Parameterized.class) - public static class FileUtilParamTest2 { - - @Parameter - public String expectedString; - - @Parameter(1) - public String originalName; - - @Parameter(2) - public String newExtension; - - @Parameters - public static Collection data() { - return Arrays.asList(new Object[][] { - // functional approach: what should the method do - // replace no extension with an empty extension - { "no-extension.", "no-extension", ""}, - - // replace extension x with same extension - { "extension.x", "extension.x", "x" }, - - // replace extension x with another extension y - { "extension.y", "extension.x", "y" }, - - // interface approach: what are possible inputs - // will not pass as null is not handled - //{ null, null, null }, - //{ null, null, "" }, - //{ null, null, "y" }, - - { ".null", "", null }, - { ".", "", "" }, - { ".y", "", "y" }, - }); - } - - @Test - public void testReplaceExtension() { - assertEquals(expectedString, FileUtil.replaceExtension(originalName, newExtension)); - } - + + @ParameterizedTest + @MethodSource("dataFilenames") + void testGetCiteDataFileFilename(String expectedFileName, String actualFileName, FileCitationExtension citationExtension) { + assertEquals(expectedFileName, FileUtil.getCiteDataFileFilename(actualFileName, citationExtension)); + } + + static Stream dataReplaceNames() { + return Stream.of( + // functional approach: what should the method do + // replace no extension with an empty extension + Arguments.of("no-extension.", "no-extension", ""), + + // replace extension x with same extension + Arguments.of("extension.x", "extension.x", "x"), + + // replace extension x with another extension y + Arguments.of("extension.y", "extension.x", "y"), + + // interface approach: what are possible inputs + // will not pass as null is not handled + //Arguments.of(null, null, null), + //Arguments.of(null, null, ""), + //Arguments.of(null, null, "y"), + + Arguments.of(".null", "", null), + Arguments.of(".", "", ""), + Arguments.of(".y", "", "y") + ); + } + + @ParameterizedTest + @MethodSource("dataReplaceNames") + void testReplaceExtension(String expectedString, String originalName, String newExtension) { + assertEquals(expectedString, FileUtil.replaceExtension(originalName, newExtension)); } - public static class FileUtilNoParamTest { + static class FileUtilNoParamTest { @Test public void testIsDownloadPopupRequiredNull() { - assertEquals(false, FileUtil.isDownloadPopupRequired(null)); + assertFalse(FileUtil.isDownloadPopupRequired(null)); } @Test @@ -121,7 +92,7 @@ public void testIsDownloadPopupRequiredDraft() { Dataset dataset = new Dataset(); DatasetVersion dsv1 = dataset.getOrCreateEditVersion(); assertEquals(DatasetVersion.VersionState.DRAFT, dsv1.getVersionState()); - assertEquals(false, FileUtil.isDownloadPopupRequired(dsv1)); + assertFalse(FileUtil.isDownloadPopupRequired(dsv1)); } @Test @@ -133,7 +104,7 @@ public void testIsDownloadPopupRequiredLicenseCC0() { license.setDefault(true); termsOfUseAndAccess.setLicense(license); dsv1.setTermsOfUseAndAccess(termsOfUseAndAccess); - assertEquals(false, FileUtil.isDownloadPopupRequired(dsv1)); + assertFalse(FileUtil.isDownloadPopupRequired(dsv1)); } @Test @@ -151,7 +122,7 @@ public void testIsDownloadPopupRequiredHasTermsOfUseAndCc0License() { termsOfUseAndAccess.setLicense(license); termsOfUseAndAccess.setTermsOfUse("be excellent to each other"); dsv1.setTermsOfUseAndAccess(termsOfUseAndAccess); - assertEquals(false, FileUtil.isDownloadPopupRequired(dsv1)); + assertFalse(FileUtil.isDownloadPopupRequired(dsv1)); } @Test @@ -162,7 +133,7 @@ public void testIsDownloadPopupRequiredHasTermsOfUseAndNoneLicense() { termsOfUseAndAccess.setLicense(null); termsOfUseAndAccess.setTermsOfUse("be excellent to each other"); dsv1.setTermsOfUseAndAccess(termsOfUseAndAccess); - assertEquals(true, FileUtil.isDownloadPopupRequired(dsv1)); + assertTrue(FileUtil.isDownloadPopupRequired(dsv1)); } @Test @@ -172,7 +143,7 @@ public void testIsDownloadPopupRequiredHasTermsOfAccess() { TermsOfUseAndAccess termsOfUseAndAccess = new TermsOfUseAndAccess(); termsOfUseAndAccess.setTermsOfAccess("Terms of *Access* is different than Terms of Use"); dsv1.setTermsOfUseAndAccess(termsOfUseAndAccess); - assertEquals(true, FileUtil.isDownloadPopupRequired(dsv1)); + assertTrue(FileUtil.isDownloadPopupRequired(dsv1)); } @Test @@ -186,17 +157,17 @@ public void testIsDownloadPopupRequiredHasGuestBook() { dataset.setGuestbook(guestbook); Dataverse dataverse = new Dataverse(); guestbook.setDataverse(dataverse); - assertEquals(true, FileUtil.isDownloadPopupRequired(datasetVersion)); + assertTrue(FileUtil.isDownloadPopupRequired(datasetVersion)); } @Test public void testIsPubliclyDownloadable() { - assertEquals(false, FileUtil.isPubliclyDownloadable(null)); + assertFalse(FileUtil.isPubliclyDownloadable(null)); FileMetadata restrictedFileMetadata = new FileMetadata(); restrictedFileMetadata.setRestricted(true); restrictedFileMetadata.setDataFile(new DataFile()); - assertEquals(false, FileUtil.isPubliclyDownloadable(restrictedFileMetadata)); + assertFalse(FileUtil.isPubliclyDownloadable(restrictedFileMetadata)); FileMetadata nonRestrictedFileMetadata = new FileMetadata(); nonRestrictedFileMetadata.setDataFile(new DataFile()); @@ -206,7 +177,7 @@ public void testIsPubliclyDownloadable() { Dataset dataset = new Dataset(); dsv.setDataset(dataset); nonRestrictedFileMetadata.setRestricted(false); - assertEquals(true, FileUtil.isPubliclyDownloadable(nonRestrictedFileMetadata)); + assertTrue(FileUtil.isPubliclyDownloadable(nonRestrictedFileMetadata)); } @Test @@ -223,7 +194,7 @@ public void testIsPubliclyDownloadable2() { Dataset dataset = new Dataset(); dsv.setDataset(dataset); nonRestrictedFileMetadata.setRestricted(false); - assertEquals(false, FileUtil.isPubliclyDownloadable(nonRestrictedFileMetadata)); + assertFalse(FileUtil.isPubliclyDownloadable(nonRestrictedFileMetadata)); } @Test @@ -241,7 +212,7 @@ public void testIsPubliclyDownloadable3() { Dataset dataset = new Dataset(); dsv.setDataset(dataset); embargoedFileMetadata.setRestricted(false); - assertEquals(false, FileUtil.isPubliclyDownloadable(embargoedFileMetadata)); + assertFalse(FileUtil.isPubliclyDownloadable(embargoedFileMetadata)); } @Test @@ -263,7 +234,7 @@ public void testgetFileDownloadUrl() { @Test public void testGetPublicDownloadUrl() { - assertEquals(null, FileUtil.getPublicDownloadUrl(null, null, null)); + assertNull(FileUtil.getPublicDownloadUrl(null, null, null)); assertEquals("https://demo.dataverse.org/api/access/datafile/:persistentId?persistentId=doi:10.5072/FK2/TLU3EP", FileUtil.getPublicDownloadUrl("https://demo.dataverse.org", "doi:10.5072/FK2/TLU3EP", 33L)); //pid before fileId assertEquals("https://demo.dataverse.org/api/access/datafile/:persistentId?persistentId=doi:10.5072/FK2/TLU3EP", FileUtil.getPublicDownloadUrl("https://demo.dataverse.org", "doi:10.5072/FK2/TLU3EP", null)); assertEquals("https://demo.dataverse.org/api/access/datafile/33", FileUtil.getPublicDownloadUrl("https://demo.dataverse.org", null, 33L)); //pid before fileId diff --git a/src/test/java/edu/harvard/iq/dataverse/util/JsfHelperTest.java b/src/test/java/edu/harvard/iq/dataverse/util/JsfHelperTest.java index 0f68c1e7371..316b9c3a2aa 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/JsfHelperTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/JsfHelperTest.java @@ -35,34 +35,22 @@ public void setUp() { @AfterEach public void tearDown() { } - - public TestEnum inputEnum; - public String inputString; - public TestEnum defaultEnumValue; - public JsfHelperTest(TestEnum inputEnum, String inputString, TestEnum defaultEnumValue) { - this.inputEnum = inputEnum; - this.inputString = inputString; - this.defaultEnumValue = defaultEnumValue; - } - - @Parameters - public static Collection parameters() { - return Arrays.asList ( - new Object[][] { - { TestEnum.Lorem, "Lorem", TestEnum.Dolor }, - { TestEnum.Lorem, "Lorem ", TestEnum.Dolor }, - { TestEnum.Dolor, null, TestEnum.Dolor }, - { TestEnum.Dolor, "THIS IS A BAD VALUE", TestEnum.Dolor }, - } + static Stream parameters() { + return Stream.of( + Arguments.of(TestEnum.Lorem, "Lorem", TestEnum.Dolor), + Arguments.of(TestEnum.Lorem, "Lorem ", TestEnum.Dolor), + Arguments.of(TestEnum.Dolor, null, TestEnum.Dolor), + Arguments.of(TestEnum.Dolor, "THIS IS A BAD VALUE", TestEnum.Dolor ) ); } /** * Test of enumValue method, of class JsfHelper. */ - @Test - public void testEnumValue() { + @ParameterizedTest + @MethodSource("parameters") + public void testEnumValue(TestEnum inputEnum, String inputString, TestEnum defaultEnumValue) { System.out.println("enumValue"); JsfHelper instance = new JsfHelper(); diff --git a/src/test/java/edu/harvard/iq/dataverse/util/StringUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/util/StringUtilTest.java index f999b48ea9c..b00b4afca7d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/StringUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/StringUtilTest.java @@ -93,70 +93,51 @@ void testSubstringIncludingLast(String str, String separator, String expectedStr assertEquals( expectedString, StringUtil.substringIncludingLast(str, separator) ); } - @Parameters - public static Collection parameters() { - return Arrays.asList( - new Object[][] { - {null, Optional.empty()}, - {"", Optional.empty()}, - {" leadingWhitespace", Optional.of("leadingWhitespace")}, - {"trailingWhiteSpace ", Optional.of("trailingWhiteSpace")}, - {"someString", Optional.of("someString")}, - {"some string with spaces", Optional.of("some string with spaces")} - } - ); - } - - @Test - public void testToOption() { - assertEquals(expected, StringUtil.toOption(inputString)); - } + static Stream toOptionData() { + return Stream.of( + Arguments.of(Optional.empty(), null), + Arguments.of(Optional.empty(), ""), + Arguments.of(Optional.of("leadingWhitespace"), " leadingWhitespace"), + Arguments.of(Optional.of("trailingWhiteSpace"), "trailingWhiteSpace "), + Arguments.of(Optional.of("someString"), "someString"), + Arguments.of(Optional.of("some string with spaces"), "some string with spaces") + ); } - - @RunWith(Parameterized.class) - public static class TestSanitizeFileDirectory { - - public String inputString; - public String expected; - public boolean aggressively; - - public TestSanitizeFileDirectory(String inputString, String expected, boolean aggressively) { - this.inputString = inputString; - this.expected = expected; - this.aggressively = aggressively; - } - - @Parameters - public static Collection parameters() { - return Arrays.asList( - new Object[][] { - {"some\\path\\to\\a\\directory", "some/path/to/a/directory", false}, - {"some\\//path\\//to\\//a\\//directory", "some/path/to/a/directory", false}, - // starts with / or - or . or whitepsace - {"/some/path/to/a/directory", "some/path/to/a/directory", false}, - {"-some/path/to/a/directory", "some/path/to/a/directory", false}, - {".some/path/to/a/directory", "some/path/to/a/directory", false}, - {" some/path/to/a/directory", "some/path/to/a/directory", false}, - // ends with / or - or . or whitepsace - {"some/path/to/a/directory/", "some/path/to/a/directory", false}, - {"some/path/to/a/directory-", "some/path/to/a/directory", false}, - {"some/path/to/a/directory.", "some/path/to/a/directory", false}, - {"some/path/to/a/directory ", "some/path/to/a/directory", false}, - - {"", null, false}, - {"/", null, false}, - - // aggressively - {"some/path/to/a/dire{`~}ctory", "some/path/to/a/dire.ctory", true}, - {"some/path/to/a/directory\\.\\.", "some/path/to/a/directory", true}, - } - ); - } - - @Test - public void testSanitizeFileDirectory() { - assertEquals(expected, StringUtil.sanitizeFileDirectory(inputString, aggressively)); - } + + @ParameterizedTest + @MethodSource("toOptionData") + void testToOption(Optional expected, String inputString) { + assertEquals(expected, StringUtil.toOption(inputString)); + } + + static Stream sanitizeData() { + return Stream.of( + Arguments.of("some\\path\\to\\a\\directory", "some/path/to/a/directory", false), + Arguments.of("some\\//path\\//to\\//a\\//directory", "some/path/to/a/directory", false), + // starts with / or - or . or whitepsace + Arguments.of("/some/path/to/a/directory", "some/path/to/a/directory", false), + Arguments.of("-some/path/to/a/directory", "some/path/to/a/directory", false), + Arguments.of(".some/path/to/a/directory", "some/path/to/a/directory", false), + Arguments.of(" some/path/to/a/directory", "some/path/to/a/directory", false), + // ends with / or - or . or whitepsace + Arguments.of("some/path/to/a/directory/", "some/path/to/a/directory", false), + Arguments.of("some/path/to/a/directory-", "some/path/to/a/directory", false), + Arguments.of("some/path/to/a/directory.", "some/path/to/a/directory", false), + Arguments.of("some/path/to/a/directory ", "some/path/to/a/directory", false), + + Arguments.of("", null, false), + Arguments.of("/", null, false), + + // aggressively + Arguments.of("some/path/to/a/dire{`~}ctory", "some/path/to/a/dire.ctory", true), + Arguments.of("some/path/to/a/directory\\.\\.", "some/path/to/a/directory", true) + ); + } + + @ParameterizedTest + @MethodSource("sanitizeData") + void testSanitizeFileDirectory(String inputString, String expected, boolean aggressively) { + assertEquals(expected, StringUtil.sanitizeFileDirectory(inputString, aggressively)); } public static class StringUtilNoParamTest{ diff --git a/src/test/java/edu/harvard/iq/dataverse/validation/PasswordValidatorUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/validation/PasswordValidatorUtilTest.java index 99d42cbb1ff..c5a38c473fb 100644 --- a/src/test/java/edu/harvard/iq/dataverse/validation/PasswordValidatorUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/validation/PasswordValidatorUtilTest.java @@ -26,7 +26,7 @@ */ public class PasswordValidatorUtilTest { - public static class PasswordValidatorUtilNoParamTest { + static class PasswordValidatorUtilNoParamTest { /** * Test of getPasswordRequirements method, of class PasswordValidatorUtil. */ @@ -76,79 +76,38 @@ public void testParseConfigString() { } - @RunWith(Parameterized.class) - public static class PasswordValidatorUtilParamTest { - - // influences use of # or "each" in text generation - @Parameter(0) - public int numberOfCharacteristics; - - @Parameter(1) - public String characterRulesConfigString; - - @Parameter(2) - public String expectedValue; - - @Parameters - public static Collection data() { - return Arrays.asList(new Object[][] { - { - 2, - null, - "At least 1 character from each of the following types: letter, numeral" - }, - { - 2, - "UpperCase:1,LowerCase:1,Digit:1,Special:1", - "At least 1 character from 2 of the following types: uppercase, lowercase, numeral, special" - }, - { - 4, - "UpperCase:1,LowerCase:1,Digit:1,Special:1", - "At least 1 character from each of the following types: uppercase, lowercase, numeral, special" - }, - - // Should say each, even if more characteristics set than possible - { - 2, - "Digit:1", - "At least 1 character from each of the following types: numeral" - }, - - { - 2, - "Digit:2", - "Fufill 2: At least 2 numeral characters" - }, - { - 2, - "LowerCase:1,Digit:2,Special:3", - "Fufill 2: At least 1 lowercase characters, 2 numeral characters, 3 special characters" - }, - - // letter is mentioned even though that configuration is discouraged - { - 2, - "UpperCase:1,LowerCase:1,Digit:1,Special:1,Alphabetical:1", - "At least 1 character from 2 of the following types: uppercase, lowercase, letter, numeral, special" - } - }); - } - - @Test - public void testGetRequiredCharacters() { - List characterRules; - String message = "Character rules string for "; - if (characterRulesConfigString != null) { - characterRules = PasswordValidatorUtil.getCharacterRules(characterRulesConfigString); - message += characterRulesConfigString; - } else { - characterRules = PasswordValidatorUtil.getCharacterRulesDefault(); - message += "default"; - } - - String reqString = PasswordValidatorUtil.getRequiredCharacters(characterRules, numberOfCharacteristics); - assertEquals(message + ": " + reqString, expectedValue, reqString); + static Stream configurations() { + return Stream.of( + Arguments.of(2, null, + "At least 1 character from each of the following types: letter, numeral"), + Arguments.of(2, "UpperCase:1,LowerCase:1,Digit:1,Special:1", + "At least 1 character from 2 of the following types: uppercase, lowercase, numeral, special"), + Arguments.of(4, "UpperCase:1,LowerCase:1,Digit:1,Special:1", + "At least 1 character from each of the following types: uppercase, lowercase, numeral, special"), + // Should say each, even if more characteristics set than possible + Arguments.of(2, "Digit:1", "At least 1 character from each of the following types: numeral"), + Arguments.of(2, "Digit:2", "Fufill 2: At least 2 numeral characters"), + Arguments.of(2, "LowerCase:1,Digit:2,Special:3", + "Fufill 2: At least 1 lowercase characters, 2 numeral characters, 3 special characters"), + // letter is mentioned even though that configuration is discouraged + Arguments.of(2, "UpperCase:1,LowerCase:1,Digit:1,Special:1,Alphabetical:1", + "At least 1 character from 2 of the following types: uppercase, lowercase, letter, numeral, special") + ); + } + @ParameterizedTest + @MethodSource("configurations") + void testGetRequiredCharacters(int numberOfCharacteristics, String characterRulesConfigString, String expectedValue) { + List characterRules; + String message = "Character rules string for "; + if (characterRulesConfigString != null) { + characterRules = PasswordValidatorUtil.getCharacterRules(characterRulesConfigString); + message += characterRulesConfigString; + } else { + characterRules = PasswordValidatorUtil.getCharacterRulesDefault(); + message += "default"; } + + String reqString = PasswordValidatorUtil.getRequiredCharacters(characterRules, numberOfCharacteristics); + assertEquals(expectedValue, reqString, message + ": " + reqString); } } From ddd0dccfa978f4757f1c4a95306035c26ff8b325 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Fri, 18 Aug 2023 17:49:55 +0200 Subject: [PATCH 089/173] build(test): migrate JUnit4 temp dir rules to JUnit5 @TempDir #9782 --- .../ingest/IngestableDataCheckerTest.java | 11 ++---- .../util/shapefile/ShapefileHandlerTest.java | 37 ++++--------------- 2 files changed, 12 insertions(+), 36 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/ingest/IngestableDataCheckerTest.java b/src/test/java/edu/harvard/iq/dataverse/ingest/IngestableDataCheckerTest.java index 8bff81e7c87..11257f188fe 100644 --- a/src/test/java/edu/harvard/iq/dataverse/ingest/IngestableDataCheckerTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/ingest/IngestableDataCheckerTest.java @@ -29,9 +29,6 @@ */ public class IngestableDataCheckerTest { - @Rule - public TemporaryFolder tempFolder = new TemporaryFolder(); - public IngestableDataCheckerTest() { } @@ -60,14 +57,14 @@ private File createTempFile(String filename, String fileContents) throws IOExcep if (filename == null){ return null; } - File fh = this.tempFolder.newFile(filename); - fh.createNewFile(); + + Path tmpFile = Files.createTempFile("ingestdatachecker", ""); if (fileContents != null){ - FileUtils.writeStringToFile(fh, fileContents); + Files.writeString(tmpFile, fileContents, StandardCharsets.UTF_8); } - return fh; + return tmpFile.toFile(); } private MappedByteBuffer createTempFileAndGetBuffer(String filename, String fileContents) throws IOException { diff --git a/src/test/java/edu/harvard/iq/dataverse/util/shapefile/ShapefileHandlerTest.java b/src/test/java/edu/harvard/iq/dataverse/util/shapefile/ShapefileHandlerTest.java index 568cec3a9a9..482981264c4 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/shapefile/ShapefileHandlerTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/shapefile/ShapefileHandlerTest.java @@ -42,10 +42,8 @@ */ public class ShapefileHandlerTest { - - @Rule - public TemporaryFolder tempFolder = new TemporaryFolder(); - + @TempDir + Path tempFolder; public void msg(String s){ System.out.println(s); @@ -63,28 +61,9 @@ private File createBlankFile(String filename) throws IOException { if (filename == null){ return null; } - File aFile = this.tempFolder.newFile(filename); - // FileUtils.writeStringToFile(tempFile, "hello world"); - - aFile.createNewFile(); - return aFile; + return Files.createFile(tempFolder.resolve(filename)).toFile(); } - - - - private void showFilesInFolder(String m, String folder_name) throws IOException{ - msgt(m); - File folder = new File(folder_name); - for (File f : folder.listFiles() ){ - this.msg("fname: " + f.getCanonicalPath()); - } - } - - private void showFilesInTempFolder(String m) throws IOException{ - this.showFilesInFolder(m, this.tempFolder.getRoot().getAbsolutePath()); - } - private FileInputStream createZipReturnFilestream(List file_names, String zipfile_name) throws IOException{ File zip_file_obj = this.createAndZipFiles(file_names, zipfile_name); @@ -118,8 +97,8 @@ private File createAndZipFiles(List file_names, String zipfile_name) thr //msg("File created: " + file_obj.getName()); } - File zip_file_obj = this.tempFolder.newFile(zipfile_name); - ZipOutputStream zip_stream = new ZipOutputStream(new FileOutputStream(zip_file_obj)); + Path zip_file_obj = this.tempFolder.resolve(zipfile_name); + ZipOutputStream zip_stream = new ZipOutputStream(new FileOutputStream(zip_file_obj.toFile())); // Iterate through File objects and add them to the ZipOutputStream for (File file_obj : fileCollection) { @@ -133,7 +112,7 @@ private File createAndZipFiles(List file_names, String zipfile_name) thr file_obj.delete(); } - return zip_file_obj; + return zip_file_obj.toFile(); } // end createAndZipFiles @@ -211,7 +190,7 @@ public void testZippedTwoShapefiles() throws IOException{ // Rezip/Reorder the files - File test_unzip_folder = this.tempFolder.newFolder("test_unzip").getAbsoluteFile(); + File test_unzip_folder = Files.createDirectory(this.tempFolder.resolve("test_unzip")).toFile(); //File test_unzip_folder = new File("/Users/rmp553/Desktop/blah"); shp_handler.rezipShapefileSets(new FileInputStream(zipfile_obj), test_unzip_folder ); @@ -258,7 +237,7 @@ public void testZippedShapefileWithExtraFiles() throws IOException{ assertEquals("verify value of key 'README'", file_groups.get("README"), Arrays.asList("md")); assertEquals("verify value of key 'shape_notes'", file_groups.get("shape_notes"), Arrays.asList("txt")); - File unzip2Folder = this.tempFolder.newFolder("test_unzip2").getAbsoluteFile(); + File unzip2Folder = Files.createDirectory(this.tempFolder.resolve("test_unzip2")).toFile(); // Rezip/Reorder the files shp_handler.rezipShapefileSets(new FileInputStream(zipfile_obj), unzip2Folder); //shp_handler.rezipShapefileSets(new FileInputStream(zipfile_obj), new File("/Users/rmp553/Desktop/blah")); From 9b8dc3d09581e3b7244cbe150565476f261271c1 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Fri, 18 Aug 2023 17:56:11 +0200 Subject: [PATCH 090/173] build(test): migrate JUnit4 assertion arguments order to JUnit5 style, simplify where reasonable #9782 --- .../dataverse/DatasetFieldValidatorTest.java | 5 +- .../edu/harvard/iq/dataverse/DatasetTest.java | 18 +++--- .../harvard/iq/dataverse/api/AccessIT.java | 10 ++-- .../edu/harvard/iq/dataverse/api/AdminIT.java | 2 +- .../iq/dataverse/api/AuxiliaryFilesIT.java | 2 +- .../harvard/iq/dataverse/api/DatasetsIT.java | 14 ++--- .../iq/dataverse/api/DownloadFilesIT.java | 2 +- .../harvard/iq/dataverse/api/EditDDIIT.java | 2 +- .../iq/dataverse/api/ExternalToolsIT.java | 2 +- .../edu/harvard/iq/dataverse/api/FilesIT.java | 16 +++--- .../iq/dataverse/api/HarvestingClientsIT.java | 2 +- .../iq/dataverse/api/HarvestingServerIT.java | 48 +++++++--------- .../iq/dataverse/api/InReviewWorkflowIT.java | 2 +- .../harvard/iq/dataverse/api/SearchIT.java | 4 +- .../edu/harvard/iq/dataverse/api/SwordIT.java | 4 +- .../harvard/iq/dataverse/api/TabularIT.java | 2 +- .../edu/harvard/iq/dataverse/api/UsersIT.java | 2 +- .../groups/GroupServiceBeanTest.java | 4 +- .../impl/ipaddress/ip/IPv6AddressTest.java | 48 ++++++++-------- .../impl/ipaddress/ip/IpAddressRangeTest.java | 2 +- .../users/AuthenticatedUserTest.java | 20 +++---- .../impl/CreateDataverseCommandTest.java | 4 +- .../command/impl/CreateRoleCommandTest.java | 2 +- ...estPublishedDatasetVersionCommandTest.java | 12 ++-- .../externaltools/ExternalToolTest.java | 14 ++--- .../impl/plugins/csv/CSVFileReaderTest.java | 20 +++---- .../harvard/iq/dataverse/util/BitSetTest.java | 8 +-- .../iq/dataverse/util/LruCacheTest.java | 18 +++--- .../dataverse/util/json/JsonParserTest.java | 6 +- .../util/shapefile/ShapefileHandlerTest.java | 56 +++++++++---------- 30 files changed, 167 insertions(+), 184 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldValidatorTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldValidatorTest.java index e9296b431dc..659e42a68c4 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldValidatorTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldValidatorTest.java @@ -45,6 +45,7 @@ public void tearDown() { /** * Test of isValid method, of class DatasetFieldValidator. + * TODO: this should be converted into one or two ParameterizedTest methods, potentially including a DisplayNameGenerator */ @Test public void testIsValid() { @@ -85,7 +86,7 @@ private void testPrimitiveDatasetField(String test, boolean required, String val testDatasetField.setSingleValue(value); DatasetFieldValidator datasetFieldValidator = new DatasetFieldValidator(); - assertEquals( test, expectedOutcome, datasetFieldValidator.isValid(testDatasetField, constraintValidatorContext)); + assertEquals(expectedOutcome, datasetFieldValidator.isValid(testDatasetField, constraintValidatorContext), test); } @@ -121,7 +122,7 @@ private void testCompoundDatasetField(String test, boolean requiredParent, boole DatasetFieldValidator datasetFieldValidator = new DatasetFieldValidator(); - assertEquals( test, expectedOutcome, datasetFieldValidator.isValid(child1DatasetField, constraintValidatorContext)); + assertEquals(expectedOutcome, datasetFieldValidator.isValid(child1DatasetField, constraintValidatorContext), test); } @Test diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetTest.java index cd5186e6a87..2153a336303 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetTest.java @@ -24,38 +24,38 @@ public class DatasetTest { @Test public void testIsLockedFor() { Dataset sut = new Dataset(); - assertFalse( "Initially verify that the dataset is not locked because data being ingested", sut.isLockedFor(DatasetLock.Reason.Ingest) ); + assertFalse(sut.isLockedFor(DatasetLock.Reason.Ingest), "Initially verify that the dataset is not locked because data being ingested"); DatasetLock dl = new DatasetLock(DatasetLock.Reason.Ingest, MocksFactory.makeAuthenticatedUser("jane", "doe")); sut.addLock(dl); - assertTrue( "Verify that the dataset now has an ingest lock", sut.isLockedFor(DatasetLock.Reason.Ingest) ); - assertFalse( "Verify that the dataset does not have a workflow lock", sut.isLockedFor(DatasetLock.Reason.Workflow) ); + assertTrue(sut.isLockedFor(DatasetLock.Reason.Ingest), "Verify that the dataset now has an ingest lock"); + assertFalse(sut.isLockedFor(DatasetLock.Reason.Workflow), "Verify that the dataset does not have a workflow lock"); } @Test public void testLocksManagement() { Dataset sut = new Dataset(); - assertFalse( "Initially verify that the dataset is not locked", sut.isLocked() ); + assertFalse(sut.isLocked(), "Initially verify that the dataset is not locked"); DatasetLock dlIngest = new DatasetLock(DatasetLock.Reason.Ingest, MocksFactory.makeAuthenticatedUser("jane", "doe")); dlIngest.setId(MocksFactory.nextId()); sut.addLock(dlIngest); - assertTrue( "After adding an ingest lock, verify that the dataset is locked", sut.isLocked() ); + assertTrue(sut.isLocked(), "After adding an ingest lock, verify that the dataset is locked"); final DatasetLock dlInReview = new DatasetLock(DatasetLock.Reason.InReview, MocksFactory.makeAuthenticatedUser("jane", "doe")); dlInReview.setId(MocksFactory.nextId()); sut.addLock(dlInReview); - assertEquals( "After adding a review lock, verify that the dataset is locked by two locks", 2, sut.getLocks().size() ); + assertEquals(2, sut.getLocks().size(), "After adding a review lock, verify that the dataset is locked by two locks"); DatasetLock retrievedDl = sut.getLockFor(DatasetLock.Reason.Ingest); assertEquals( dlIngest, retrievedDl ); sut.removeLock(dlIngest); - assertNull( "After removing the ingest lock, verify that the dataset does not have any ingest locks", sut.getLockFor(DatasetLock.Reason.Ingest) ); + assertNull(sut.getLockFor(DatasetLock.Reason.Ingest), "After removing the ingest lock, verify that the dataset does not have any ingest locks"); - assertTrue( "After removing the ingest lock, verify that the dataset is still locked (review lock)", sut.isLocked() ); + assertTrue(sut.isLocked(), "After removing the ingest lock, verify that the dataset is still locked (review lock)"); sut.removeLock(dlInReview); - assertFalse( "After removing the review lock, verify that the dataset is not locked anymore", sut.isLocked() ); + assertFalse(sut.isLocked(), "After removing the review lock, verify that the dataset is not locked anymore"); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/AccessIT.java b/src/test/java/edu/harvard/iq/dataverse/api/AccessIT.java index c3a0de04c8d..eab49e33d5c 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/AccessIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/AccessIT.java @@ -124,7 +124,7 @@ public static void setUp() throws InterruptedException { tabFile2NameConvert = tabFile2Name.substring(0, tabFile2Name.indexOf(".dta")) + ".tab"; String tab2PathToFile = "scripts/search/data/tabular/" + tabFile2Name; - assertTrue("Failed test if Ingest Lock exceeds max duration " + tabFile2Name, UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION)); + assertTrue(UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION), "Failed test if Ingest Lock exceeds max duration " + tabFile2Name); Response tab2AddResponse = UtilIT.uploadFileViaNative(datasetId.toString(), tab2PathToFile, apiToken); tabFile2Id = JsonPath.from(tab2AddResponse.body().asString()).getInt("data.files[0].dataFile.id"); @@ -133,13 +133,13 @@ public static void setUp() throws InterruptedException { tabFile3NameRestrictedConvert = tabFile3NameRestricted.substring(0, tabFile3NameRestricted.indexOf(".dta")) + ".tab"; String tab3PathToFile = "scripts/search/data/tabular/" + tabFile3NameRestricted; - assertTrue("Failed test if Ingest Lock exceeds max duration " + tabFile3NameRestricted , UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION)); + assertTrue(UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION), "Failed test if Ingest Lock exceeds max duration " + tabFile3NameRestricted); Response tab3AddResponse = UtilIT.uploadFileViaNative(datasetId.toString(), tab3PathToFile, apiToken); tabFile3IdRestricted = JsonPath.from(tab3AddResponse.body().asString()).getInt("data.files[0].dataFile.id"); - assertTrue("Failed test if Ingest Lock exceeds max duration " + tabFile3NameRestricted , UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION)); + assertTrue(UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION), "Failed test if Ingest Lock exceeds max duration " + tabFile3NameRestricted); Response restrictResponse = UtilIT.restrictFile(tabFile3IdRestricted.toString(), true, apiToken); restrictResponse.prettyPrint(); @@ -158,7 +158,7 @@ public static void setUp() throws InterruptedException { String tab4PathToFile = "scripts/search/data/tabular/" + tabFile4NameUnpublished; Response tab4AddResponse = UtilIT.uploadFileViaNative(datasetId.toString(), tab4PathToFile, apiToken); tabFile4IdUnpublished = JsonPath.from(tab4AddResponse.body().asString()).getInt("data.files[0].dataFile.id"); - assertTrue("Failed test if Ingest Lock exceeds max duration " + tabFile2Name, UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION)); + assertTrue(UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION), "Failed test if Ingest Lock exceeds max duration " + tabFile2Name); } @@ -484,7 +484,7 @@ public void testRequestAccess() throws InterruptedException { Response tab3AddResponse = UtilIT.uploadFileViaNative(datasetIdNew.toString(), tab3PathToFile, apiToken); Integer tabFile3IdRestrictedNew = JsonPath.from(tab3AddResponse.body().asString()).getInt("data.files[0].dataFile.id"); - assertTrue("Failed test if Ingest Lock exceeds max duration " + tab3PathToFile , UtilIT.sleepForLock(datasetIdNew.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION)); + assertTrue(UtilIT.sleepForLock(datasetIdNew.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION), "Failed test if Ingest Lock exceeds max duration " + tab3PathToFile); Response restrictResponse = UtilIT.restrictFile(tabFile3IdRestrictedNew.toString(), true, apiToken); restrictResponse.prettyPrint(); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/AdminIT.java b/src/test/java/edu/harvard/iq/dataverse/api/AdminIT.java index 7f3a6d70252..3685627df3d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/AdminIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/AdminIT.java @@ -605,7 +605,7 @@ public void testRecalculateDataFileHash() { String superuserUsername = UtilIT.getUsernameFromResponse(createSuperuser); UtilIT.makeSuperUser(superuserUsername); - assertTrue("Failed test if Ingest Lock exceeds max duration " + origFileId, UtilIT.sleepForLock(datasetId.longValue(), "Ingest", superuserApiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION)); + assertTrue(UtilIT.sleepForLock(datasetId.longValue(), "Ingest", superuserApiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION), "Failed test if Ingest Lock exceeds max duration " + origFileId); //Bad file id Response computeDataFileHashResponse = UtilIT.computeDataFileHashValue("BadFileId", DataFile.ChecksumType.MD5.toString(), superuserApiToken); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/AuxiliaryFilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/AuxiliaryFilesIT.java index 3c77be56810..5f32d655f4f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/AuxiliaryFilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/AuxiliaryFilesIT.java @@ -62,7 +62,7 @@ public void testUploadAuxFiles() throws IOException { Long fileId = JsonPath.from(uploadFile.body().asString()).getLong("data.files[0].dataFile.id"); - assertTrue("Failed test if Ingest Lock exceeds max duration " + pathToDataFile, UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION)); + assertTrue(UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION), "Failed test if Ingest Lock exceeds max duration " + pathToDataFile); Response restrictFile = UtilIT.restrictFile(fileId.toString(), true, apiToken); restrictFile.prettyPrint(); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java index 990bac7cfe0..c03a1cc0935 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java @@ -1970,7 +1970,7 @@ public void testDatasetLocksApi() { break; } } - assertTrue("Lock missing from the output of /api/datasets/locks", lockListedCorrectly); + assertTrue(lockListedCorrectly, "Lock missing from the output of /api/datasets/locks"); // Try the same, but with an api token of a random, non-super user // (this should get rejected): @@ -2000,7 +2000,7 @@ public void testDatasetLocksApi() { break; } } - assertTrue("Lock missing from the output of /api/datasets/locks?type=Ingest", lockListedCorrectly); + assertTrue(lockListedCorrectly, "Lock missing from the output of /api/datasets/locks?type=Ingest"); // Try to list locks of an invalid type: @@ -2314,7 +2314,7 @@ public void testUnrestrictedFileExportDdi() throws IOException { String fileId = JsonPath.from(uploadFile.body().asString()).getString("data.files[0].dataFile.id"); - assertTrue("Failed test if Ingest Lock exceeds max duration " + pathToFile, UtilIT.sleepForLock(datasetId.longValue(), "Ingest", authorApiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION)); + assertTrue(UtilIT.sleepForLock(datasetId.longValue(), "Ingest", authorApiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION), "Failed test if Ingest Lock exceeds max duration " + pathToFile); Response publishDataverse = UtilIT.publishDataverseViaNativeApi(dataverseAlias, authorApiToken); publishDataverse.then().assertThat().statusCode(OK.getStatusCode()); @@ -2386,7 +2386,7 @@ public void testRestrictFileExportDdi() throws IOException { String fileId = JsonPath.from(uploadFile.body().asString()).getString("data.files[0].dataFile.id"); - assertTrue("Failed test if Ingest Lock exceeds max duration " + pathToFile, UtilIT.sleepForLock(datasetId.longValue(), "Ingest", authorApiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION)); + assertTrue(UtilIT.sleepForLock(datasetId.longValue(), "Ingest", authorApiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION), "Failed test if Ingest Lock exceeds max duration " + pathToFile); Response restrictFile = UtilIT.restrictFile(fileId, true, authorApiToken); restrictFile.prettyPrint(); @@ -2804,7 +2804,7 @@ public void testCuratePublishedDatasetVersionCommand() throws IOException { // Give file time to ingest - assertTrue("Failed test if Ingest Lock exceeds max duration " + pathToFileThatGoesThroughIngest , UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION)); + assertTrue(UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION), "Failed test if Ingest Lock exceeds max duration " + pathToFileThatGoesThroughIngest); Response origXml = UtilIT.getFileMetadata(origFileId, null, apiToken); assertEquals(200, origXml.getStatusCode()); @@ -2944,7 +2944,7 @@ public void testRestrictFileTermsOfUseAndAccess() throws IOException { String fileId = JsonPath.from(uploadFile.body().asString()).getString("data.files[0].dataFile.id"); - assertTrue("Failed test if Ingest Lock exceeds max duration " + pathToFile, UtilIT.sleepForLock(datasetId.longValue(), "Ingest", authorApiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION)); + assertTrue(UtilIT.sleepForLock(datasetId.longValue(), "Ingest", authorApiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION), "Failed test if Ingest Lock exceeds max duration " + pathToFile); Response restrictFile = UtilIT.restrictFile(fileId, true, authorApiToken); restrictFile.prettyPrint(); @@ -3014,7 +3014,7 @@ public void testRestrictFilesWORequestAccess() throws IOException { String fileId = JsonPath.from(uploadFile.body().asString()).getString("data.files[0].dataFile.id"); - assertTrue("Failed test if Ingest Lock exceeds max duration " + pathToFile, UtilIT.sleepForLock(datasetId.longValue(), "Ingest", authorApiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION)); + assertTrue(UtilIT.sleepForLock(datasetId.longValue(), "Ingest", authorApiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION), "Failed test if Ingest Lock exceeds max duration " + pathToFile); Response restrictFile = UtilIT.restrictFile(fileId, true, authorApiToken); restrictFile.prettyPrint(); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DownloadFilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DownloadFilesIT.java index 0ce93da2666..66281558b5f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DownloadFilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DownloadFilesIT.java @@ -356,7 +356,7 @@ public void downloadAllFilesTabular() throws IOException { .body("data.files[0].label", equalTo("50by1000.dta")); // UtilIT.MAXIMUM_INGEST_LOCK_DURATION is 3 but not long enough. - assertTrue("Failed test if Ingest Lock exceeds max duration " + pathToFile, UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION + 3)); + assertTrue(UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION + 3), "Failed test if Ingest Lock exceeds max duration " + pathToFile); Response downloadFiles1 = UtilIT.downloadFiles(datasetPid, apiToken); downloadFiles1.then().assertThat() diff --git a/src/test/java/edu/harvard/iq/dataverse/api/EditDDIIT.java b/src/test/java/edu/harvard/iq/dataverse/api/EditDDIIT.java index d443b22442f..827221dcbb4 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/EditDDIIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/EditDDIIT.java @@ -80,7 +80,7 @@ public void testUpdateVariableMetadata() throws InterruptedException { // Give file time to ingest - assertTrue("Failed test if Ingest Lock exceeds max duration " + pathToFileThatGoesThroughIngest , UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION)); + assertTrue(UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION), "Failed test if Ingest Lock exceeds max duration " + pathToFileThatGoesThroughIngest); Response origXml = UtilIT.getFileMetadata(origFileId, null, apiToken); assertEquals(200, origXml.getStatusCode()); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/ExternalToolsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/ExternalToolsIT.java index 3244dffd8a8..b35c6837ae0 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/ExternalToolsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/ExternalToolsIT.java @@ -89,7 +89,7 @@ public void testFileLevelTool1() { uploadTabularFile.then().assertThat() .statusCode(OK.getStatusCode()); - assertTrue("Failed test if Ingest Lock exceeds max duration " + pathToTabularFile, UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION)); + assertTrue(UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION), "Failed test if Ingest Lock exceeds max duration " + pathToTabularFile); Integer tabularFileId = JsonPath.from(uploadTabularFile.getBody().asString()).getInt("data.files[0].dataFile.id"); JsonObjectBuilder job = Json.createObjectBuilder(); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java index 0e7ae69688d..54c44128442 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java @@ -502,7 +502,7 @@ public void test_006_ReplaceFileGoodTabular() throws InterruptedException { // give file time to ingest // sleep(10000); - assertTrue("Failed test if Ingest Lock exceeds max duration " + pathToFile , UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION)); + assertTrue(UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION), "Failed test if Ingest Lock exceeds max duration " + pathToFile); Response ddi = UtilIT.getFileMetadata(origFileId.toString(), "ddi", apiToken); // ddi.prettyPrint(); @@ -1203,7 +1203,7 @@ public void testUningestFileViaApi() throws InterruptedException { assertNotNull(origFileId); // If checkOut fails, display message // sleep(10000); - assertTrue("Failed test if Ingest Lock exceeds max duration " + pathToFile , UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION)); + assertTrue(UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION), "Failed test if Ingest Lock exceeds max duration " + pathToFile); Response uningestFileResponse = UtilIT.uningestFile(origFileId, apiToken); assertEquals(200, uningestFileResponse.getStatusCode()); } @@ -1237,7 +1237,7 @@ public void testFileMetaDataGetUpdateRoundTrip() throws InterruptedException { Long origFileId = JsonPath.from(addResponse.body().asString()).getLong("data.files[0].dataFile.id"); //sleep(2000); //ensure tsv is consumed - assertTrue("Failed test if Ingest Lock exceeds max duration " + pathToFile , UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION)); + assertTrue(UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION), "Failed test if Ingest Lock exceeds max duration " + pathToFile); msg("Publish dataverse and dataset"); Response publishDataversetResp = UtilIT.publishDataverseViaSword(dataverseAlias, apiToken); publishDataversetResp.then().assertThat() @@ -1335,7 +1335,7 @@ public void testDataSizeInDataverse() throws InterruptedException { .statusCode(OK.getStatusCode()); // wait for it to ingest... - assertTrue("Failed test if Ingest Lock exceeds max duration " + pathToFile , UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, 5)); + assertTrue(UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, 5), "Failed test if Ingest Lock exceeds max duration " + pathToFile); // sleep(10000); Response publishDataversetResp = UtilIT.publishDataverseViaSword(dataverseAlias, apiToken); @@ -1477,7 +1477,7 @@ public void testValidateDDI_issue6027() throws InterruptedException { .statusCode(OK.getStatusCode()); // give file time to ingest - assertTrue("Failed test if Ingest Lock exceeds max duration " + pathToFile , UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION)); + assertTrue(UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION), "Failed test if Ingest Lock exceeds max duration " + pathToFile); // sleep(10000); Response ddi = UtilIT.getFileMetadata(origFileId.toString(), "ddi", apiToken); @@ -1732,7 +1732,7 @@ public void testRange() throws IOException { Integer fileIdCsv = JsonPath.from(uploadFileCsv.body().asString()).getInt("data.files[0].dataFile.id"); - assertTrue("Failed test if Ingest Lock exceeds max duration " + pathToCsv, UtilIT.sleepForLock(datasetId.longValue(), "Ingest", authorApiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION)); + assertTrue(UtilIT.sleepForLock(datasetId.longValue(), "Ingest", authorApiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION), "Failed test if Ingest Lock exceeds max duration " + pathToCsv); // Just the tabular file, not the original, no byte range. Vanilla. Response downloadFileNoArgs = UtilIT.downloadFile(fileIdCsv, null, null, null, authorApiToken); @@ -1865,7 +1865,7 @@ public void testAddFileToDatasetSkipTabIngest() throws IOException, InterruptedE logger.info(r.prettyPrint()); assertEquals(200, r.getStatusCode()); - assertTrue("Failed test if Ingest Lock exceeds max duration " + pathToFile, UtilIT.sleepForLock(datasetIdInt, "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION)); + assertTrue(UtilIT.sleepForLock(datasetIdInt, "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION), "Failed test if Ingest Lock exceeds max duration " + pathToFile); Long dataFileId = JsonPath.from(r.body().asString()).getLong("data.files[0].dataFile.id"); Response fileMeta = UtilIT.getDataFileMetadataDraft(dataFileId, apiToken); @@ -1878,7 +1878,7 @@ public void testAddFileToDatasetSkipTabIngest() throws IOException, InterruptedE logger.info(rTabIngest.prettyPrint()); assertEquals(200, rTabIngest.getStatusCode()); - assertTrue("Failed test if Ingest Lock exceeds max duration " + pathToFile, UtilIT.sleepForLock(datasetIdInt, "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION)); + assertTrue(UtilIT.sleepForLock(datasetIdInt, "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION), "Failed test if Ingest Lock exceeds max duration " + pathToFile); Long ingDataFileId = JsonPath.from(rTabIngest.body().asString()).getLong("data.files[0].dataFile.id"); Response ingFileMeta = UtilIT.getDataFileMetadataDraft(ingDataFileId, apiToken); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/HarvestingClientsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/HarvestingClientsIT.java index 9c9022a95dd..67d8e8dd668 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/HarvestingClientsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/HarvestingClientsIT.java @@ -214,7 +214,7 @@ public void testHarvestingClientRun() throws InterruptedException { assertEquals(OK.getStatusCode(), getClientResponse.getStatusCode()); JsonPath responseJsonPath = getClientResponse.body().jsonPath(); - assertNotNull("Invalid JSON in GET client response", responseJsonPath); + assertNotNull(responseJsonPath, "Invalid JSON in GET client response"); assertEquals(ApiConstants.STATUS_OK, responseJsonPath.getString("status")); String clientStatus = responseJsonPath.getString("data.status"); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/HarvestingServerIT.java b/src/test/java/edu/harvard/iq/dataverse/api/HarvestingServerIT.java index 174f6a63da7..4f84f47af69 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/HarvestingServerIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/HarvestingServerIT.java @@ -376,10 +376,10 @@ public void testSetEditAPIandOAIlistSets() { List listSets = responseXmlPath.getList("OAI-PMH.ListSets.set.list().findAll{it.setName=='"+setName+"'}", Node.class); // 2a. Confirm that our set is listed: - assertNotNull("Unexpected response from ListSets", listSets); - assertTrue("Newly-created set isn't properly listed by the OAI server", listSets.size() == 1); + assertNotNull(listSets, "Unexpected response from ListSets"); + assertEquals(1, listSets.size(), "Newly-created set isn't properly listed by the OAI server"); // 2b. Confirm that the set entry contains the updated description: - assertEquals("Incorrect description in the ListSets entry", newDescription, listSets.get(0).getPath("setDescription.metadata.element.field", String.class)); + assertEquals(newDescription, listSets.get(0).getPath("setDescription.metadata.element.field", String.class), "Incorrect description in the ListSets entry"); // ok, the xml record looks good! @@ -606,12 +606,11 @@ public void testMultiRecordOaiSet() throws InterruptedException { // Validate the payload of the ListIdentifiers response: // 1a) There should be 2 items listed: - assertEquals("Wrong number of items on the first ListIdentifiers page", - 2, ret.size()); + assertEquals(2, ret.size(), "Wrong number of items on the first ListIdentifiers page"); // 1b) The response contains a resumptionToken for the next page of items: String resumptionToken = responseXmlPath.getString("OAI-PMH.ListIdentifiers.resumptionToken"); - assertNotNull("No resumption token in the ListIdentifiers response (has the jvm option dataverse.oai.server.maxidentifiers been configured?)", resumptionToken); + assertNotNull(resumptionToken, "No resumption token in the ListIdentifiers response (has the jvm option dataverse.oai.server.maxidentifiers been configured?)"); // 1c) The total number of items in the set (5) is listed correctly: assertEquals(5, responseXmlPath.getInt("OAI-PMH.ListIdentifiers.resumptionToken.@completeListSize")); @@ -653,12 +652,11 @@ public void testMultiRecordOaiSet() throws InterruptedException { // Validate the payload of the ListIdentifiers response: // 2a) There should still be 2 items listed: - assertEquals("Wrong number of items on the second ListIdentifiers page", - 2, ret.size()); + assertEquals(2, ret.size(), "Wrong number of items on the second ListIdentifiers page"); // 2b) The response should contain a resumptionToken for the next page of items: resumptionToken = responseXmlPath.getString("OAI-PMH.ListIdentifiers.resumptionToken"); - assertNotNull("No resumption token in the ListIdentifiers response", resumptionToken); + assertNotNull(resumptionToken, "No resumption token in the ListIdentifiers response"); // 2c) The total number of items in the set (5) is listed correctly: assertEquals(5, responseXmlPath.getInt("OAI-PMH.ListIdentifiers.resumptionToken.@completeListSize")); @@ -693,13 +691,12 @@ public void testMultiRecordOaiSet() throws InterruptedException { // Validate the payload of the ListIdentifiers response: // 3a) There should be only 1 item listed: - assertEquals("Wrong number of items on the final ListIdentifiers page", - 1, ret.size()); + assertEquals(1, ret.size(), "Wrong number of items on the final ListIdentifiers page"); // 3b) The response contains a resumptionToken for the next page of items: resumptionToken = responseXmlPath.getString("OAI-PMH.ListIdentifiers.resumptionToken"); - assertNotNull("No resumption token in the final ListIdentifiers response", resumptionToken); - assertTrue("Non-empty resumption token in the final ListIdentifiers response", "".equals(resumptionToken)); + assertNotNull(resumptionToken, "No resumption token in the final ListIdentifiers response"); + assertEquals("", resumptionToken, "Non-empty resumption token in the final ListIdentifiers response"); // 3c) The total number of items in the set (5) is still listed correctly: assertEquals(5, responseXmlPath.getInt("OAI-PMH.ListIdentifiers.resumptionToken.@completeListSize")); @@ -720,8 +717,7 @@ public void testMultiRecordOaiSet() throws InterruptedException { allDatasetsListed = allDatasetsListed && persistentIdsInListIdentifiers.contains(persistentId); } - assertTrue("Control datasets not properly listed in the paged ListIdentifiers response", - allDatasetsListed); + assertTrue(allDatasetsListed, "Control datasets not properly listed in the paged ListIdentifiers response"); // OK, it is safe to assume ListIdentifiers works as it should in page mode. @@ -746,12 +742,11 @@ public void testMultiRecordOaiSet() throws InterruptedException { // Validate the payload of the ListRecords response: // 4a) There should be 2 items listed: - assertEquals("Wrong number of items on the first ListRecords page", - 2, ret.size()); + assertEquals(2, ret.size(), "Wrong number of items on the first ListRecords page"); // 4b) The response contains a resumptionToken for the next page of items: resumptionToken = responseXmlPath.getString("OAI-PMH.ListRecords.resumptionToken"); - assertNotNull("No resumption token in the ListRecords response (has the jvm option dataverse.oai.server.maxrecords been configured?)", resumptionToken); + assertNotNull(resumptionToken, "No resumption token in the ListRecords response (has the jvm option dataverse.oai.server.maxrecords been configured?)"); // 4c) The total number of items in the set (5) is listed correctly: assertEquals(5, responseXmlPath.getInt("OAI-PMH.ListRecords.resumptionToken.@completeListSize")); @@ -787,12 +782,11 @@ public void testMultiRecordOaiSet() throws InterruptedException { // Validate the payload of the ListRecords response: // 4a) There should still be 2 items listed: - assertEquals("Wrong number of items on the second ListRecords page", - 2, ret.size()); + assertEquals(2, ret.size(), "Wrong number of items on the second ListRecords page"); // 4b) The response should contain a resumptionToken for the next page of items: resumptionToken = responseXmlPath.getString("OAI-PMH.ListRecords.resumptionToken"); - assertNotNull("No resumption token in the ListRecords response", resumptionToken); + assertNotNull(resumptionToken, "No resumption token in the ListRecords response"); // 4c) The total number of items in the set (5) is listed correctly: assertEquals(5, responseXmlPath.getInt("OAI-PMH.ListRecords.resumptionToken.@completeListSize")); @@ -827,13 +821,12 @@ public void testMultiRecordOaiSet() throws InterruptedException { // Validate the payload of the ListRecords response: // 6a) There should be only 1 item listed: - assertEquals("Wrong number of items on the final ListRecords page", - 1, ret.size()); + assertEquals(1, ret.size(), "Wrong number of items on the final ListRecords page"); // 6b) The response contains a resumptionToken for the next page of items: resumptionToken = responseXmlPath.getString("OAI-PMH.ListRecords.resumptionToken"); - assertNotNull("No resumption token in the final ListRecords response", resumptionToken); - assertTrue("Non-empty resumption token in the final ListRecords response", "".equals(resumptionToken)); + assertNotNull(resumptionToken, "No resumption token in the final ListRecords response"); + assertEquals("", resumptionToken, "Non-empty resumption token in the final ListRecords response"); // 6c) The total number of items in the set (5) is still listed correctly: assertEquals(5, responseXmlPath.getInt("OAI-PMH.ListRecords.resumptionToken.@completeListSize")); @@ -854,8 +847,7 @@ public void testMultiRecordOaiSet() throws InterruptedException { allDatasetsListed = allDatasetsListed && persistentIdsInListRecords.contains(persistentId); } - assertTrue("Control datasets not properly listed in the paged ListRecords response", - allDatasetsListed); + assertTrue(allDatasetsListed, "Control datasets not properly listed in the paged ListRecords response"); // OK, it is safe to assume ListRecords works as it should in page mode // as well. @@ -866,7 +858,7 @@ public void testMultiRecordOaiSet() throws InterruptedException { .header(UtilIT.API_TOKEN_HTTP_HEADER, adminUserAPIKey) .delete(setPath); logger.info("deleteResponse.getStatusCode(): " + deleteResponse.getStatusCode()); - assertEquals("Failed to delete the control multi-record set", 200, deleteResponse.getStatusCode()); + assertEquals(200, deleteResponse.getStatusCode(), "Failed to delete the control multi-record set"); } // TODO: diff --git a/src/test/java/edu/harvard/iq/dataverse/api/InReviewWorkflowIT.java b/src/test/java/edu/harvard/iq/dataverse/api/InReviewWorkflowIT.java index 736aadd9931..020a9e5dff3 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/InReviewWorkflowIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/InReviewWorkflowIT.java @@ -237,7 +237,7 @@ public void testCuratorSendsCommentsToAuthor() throws InterruptedException { // because the dataset is still locked when we try to edit it, // a few lines down. -- L.A. Oct. 2018 // Changes to test for ingest lock and 3 seconds duration SEK 09/2019 #6128 - assertTrue("Failed test if Ingest Lock exceeds max duration " + pathToFileThatGoesThroughIngest , UtilIT.sleepForLock(datasetId, "Ingest", curatorApiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION)); + assertTrue(UtilIT.sleepForLock(datasetId, "Ingest", curatorApiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION), "Failed test if Ingest Lock exceeds max duration " + pathToFileThatGoesThroughIngest); // Thread.sleep(10000); } } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java b/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java index 18c3b3a318e..7d335bc39f3 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java @@ -105,7 +105,7 @@ public void testSearchPermisions() throws InterruptedException { assertEquals(200, grantUser2AccessOnDataset.getStatusCode()); String searchPart = "id:dataset_" + datasetId1 + "_draft"; - assertTrue("Failed test if search exceeds max duration " + searchPart , UtilIT.sleepForSearch(searchPart, apiToken2, "", UtilIT.MAXIMUM_INGEST_LOCK_DURATION)); + assertTrue(UtilIT.sleepForSearch(searchPart, apiToken2, "", UtilIT.MAXIMUM_INGEST_LOCK_DURATION), "Failed test if search exceeds max duration " + searchPart); Response shouldBeVisibleToUser2 = UtilIT.search("id:dataset_" + datasetId1 + "_draft", apiToken2); shouldBeVisibleToUser2.prettyPrint(); @@ -915,7 +915,7 @@ public void testCuratorCardDataversePopulation() throws InterruptedException { String searchPart = "*"; Response searchPublishedSubtreeSuper = UtilIT.search(searchPart, apiTokenSuper, "&subtree="+parentDataverseAlias); - assertTrue("Failed test if search exceeds max duration " + searchPart , UtilIT.sleepForSearch(searchPart, apiToken, "&subtree="+parentDataverseAlias, UtilIT.MAXIMUM_INGEST_LOCK_DURATION)); + assertTrue(UtilIT.sleepForSearch(searchPart, apiToken, "&subtree="+parentDataverseAlias, UtilIT.MAXIMUM_INGEST_LOCK_DURATION), "Failed test if search exceeds max duration " + searchPart); searchPublishedSubtreeSuper.prettyPrint(); searchPublishedSubtreeSuper.then().assertThat() .statusCode(OK.getStatusCode()) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/SwordIT.java b/src/test/java/edu/harvard/iq/dataverse/api/SwordIT.java index 686670d8b3e..9a059e7e6ee 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/SwordIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/SwordIT.java @@ -73,7 +73,7 @@ public static void setUpClass() { Response checkRootDataverse = UtilIT.listDatasetsViaSword(rootDataverseAlias, apitoken); //checkRootDataverse.prettyPrint(); checkRootDataverse.then().assertThat().statusCode(OK.getStatusCode()); - assumeTrue(rootDvNotPublished, checkRootDataverse.getBody().xmlPath().getBoolean("feed.dataverseHasBeenReleased")); + assumeTrue(checkRootDataverse.getBody().xmlPath().getBoolean("feed.dataverseHasBeenReleased"), rootDvNotPublished); // check that root dataverse has permissions for any user set to dataverse + dataset creator (not admin, not curator!) checkRootDataverse = UtilIT.getRoleAssignmentsOnDataverse(rootDataverseAlias, apiTokenSuperuser); @@ -88,7 +88,7 @@ public static void setUpClass() { break; } } - assumeTrue(rootDvLackPermissions, properPermissionsSet); + assumeTrue(properPermissionsSet, rootDvLackPermissions); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/TabularIT.java b/src/test/java/edu/harvard/iq/dataverse/api/TabularIT.java index 1a5e3a7e7f0..28b2ac59ac4 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/TabularIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/TabularIT.java @@ -61,7 +61,7 @@ public void testTabularFile() throws InterruptedException { // Give file time to ingest - assertTrue("Failed test if Ingest Lock exceeds max duration " + pathToFileThatGoesThroughIngest , UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION)); + assertTrue(UtilIT.sleepForLock(datasetId.longValue(), "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION), "Failed test if Ingest Lock exceeds max duration " + pathToFileThatGoesThroughIngest); // Thread.sleep(10000); Response fileMetadataNoFormat = UtilIT.getFileMetadata(fileIdAsString, null, apiToken); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java index be1ea5b9fd6..e1696cdce4f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java @@ -162,7 +162,7 @@ public void testMergeAccounts(){ Integer tabFile3IdRestrictedNew = JsonPath.from(tab3AddResponse.body().asString()).getInt("data.files[0].dataFile.id"); //Sleep while dataset locked for ingest - assertTrue("Failed test if Ingest Lock exceeds max duration " + tabFile3NameRestrictedNew , UtilIT.sleepForLock(datasetIdNew.longValue(), "Ingest", superuserApiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION)); + assertTrue(UtilIT.sleepForLock(datasetIdNew.longValue(), "Ingest", superuserApiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION), "Failed test if Ingest Lock exceeds max duration " + tabFile3NameRestrictedNew); Response restrictResponse = UtilIT.restrictFile(tabFile3IdRestrictedNew.toString(), true, superuserApiToken); restrictResponse.prettyPrint(); diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/GroupServiceBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/GroupServiceBeanTest.java index 7c0c09d6f39..27927c33420 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/GroupServiceBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/GroupServiceBeanTest.java @@ -64,10 +64,10 @@ public void testFlattenGroupsCollection() throws GroupException { List result = sut.flattenGroupsCollection(grps).collect(toList()); - assertEquals( "Groups should appear only once", result.size(), new HashSet<>(result).size() ); + assertEquals(result.size(), new HashSet<>(result).size(), "Groups should appear only once"); grps.addAll( listOf(gAa, gAb, gAstar, AuthenticatedUsers.get()) ); - assertEquals( "All groups should appear", grps, new HashSet<>(result) ); + assertEquals(grps, new HashSet<>(result), "All groups should appear"); } diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv6AddressTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv6AddressTest.java index 2f43bc64ce8..77618e558ec 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv6AddressTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IPv6AddressTest.java @@ -38,15 +38,15 @@ public void testValueOfWithExpansion() { int[] expected = new int[]{0x2001, 0xdb8, 0x85a3, 0x0, 0, 0x8a2e, 0x370, 0x7334}; IPv6Address adr = IPv6Address.valueOf("2001:db8:85a3::8a2e:370:7334"); for (int i = 0; i < 8; i++) { - assertEquals("At index " + i + ": expecting " + expected[i] + ", got " + adr.get(i), - expected[i], adr.get(i)); + assertEquals(expected[i], adr.get(i), + "At index " + i + ": expecting " + expected[i] + ", got " + adr.get(i)); } expected = new int[]{0x2001, 0xdb8, 0x0, 0x0, 0x0, 0x0, 0x370, 0x7334}; adr = IPv6Address.valueOf("2001:db8::370:7334"); for (int i = 0; i < 8; i++) { - assertEquals("At index " + i + ": expecting " + expected[i] + ", got " + adr.get(i), - expected[i], adr.get(i)); + assertEquals(expected[i], adr.get(i), + "At index " + i + ": expecting " + expected[i] + ", got " + adr.get(i)); } } @@ -55,16 +55,16 @@ public void testValueOfWithExpansionZerosAtStart() { int[] expected = new int[]{0, 0, 0, 0, 0, 0x8a2e, 0x370, 0x7334}; IPv6Address adr = IPv6Address.valueOf("::8a2e:370:7334"); for (int i = 0; i < 8; i++) { - assertEquals("At index " + i + ": expecting " + expected[i] + ", got " + adr.get(i), - expected[i], adr.get(i)); + assertEquals(expected[i], adr.get(i), + "At index " + i + ": expecting " + expected[i] + ", got " + adr.get(i)); } expected = new int[]{0, 0, 0, 0, 0, 0, 0, 0x7334}; adr = IPv6Address.valueOf("::7334"); System.out.println("adr = " + adr); for (int i = 0; i < 8; i++) { - assertEquals("At index " + i + ": expecting " + expected[i] + ", got " + adr.get(i), - expected[i], adr.get(i)); + assertEquals(expected[i], adr.get(i), + "At index " + i + ": expecting " + expected[i] + ", got " + adr.get(i)); } } @@ -73,15 +73,15 @@ public void testValueOfWithExpansionZerosAtEnd() { int[] expected = new int[]{0x2001, 0x8a2e, 0, 0, 0, 0, 0, 0}; IPv6Address adr = IPv6Address.valueOf("2001:8a2e::"); for (int i = 0; i < 8; i++) { - assertEquals("At index " + i + ": expecting " + expected[i] + ", got " + adr.get(i), - expected[i], adr.get(i)); + assertEquals(expected[i], adr.get(i), + "At index " + i + ": expecting " + expected[i] + ", got " + adr.get(i)); } expected = new int[]{0x1337, 0, 0, 0, 0, 0, 0, 0}; adr = IPv6Address.valueOf("1337::"); for (int i = 0; i < 8; i++) { - assertEquals("At index " + i + ": expecting " + expected[i] + ", got " + adr.get(i), - expected[i], adr.get(i)); + assertEquals(expected[i], adr.get(i), + "At index " + i + ": expecting " + expected[i] + ", got " + adr.get(i)); } } @@ -91,15 +91,15 @@ public void testValueOfWithExpansionSpecialCases() { IPv6Address adr = IPv6Address.valueOf("::"); System.out.println("adr = " + adr); for (int i = 0; i < 8; i++) { - assertEquals("At index " + i + ": expecting " + expected[i] + ", got " + adr.get(i), - expected[i], adr.get(i)); + assertEquals(expected[i], adr.get(i), + "At index " + i + ": expecting " + expected[i] + ", got " + adr.get(i)); } expected = new int[]{0, 0, 0, 0, 0, 0, 0, 1}; adr = IPv6Address.valueOf("::1"); for (int i = 0; i < 8; i++) { - assertEquals("At index " + i + ": expecting " + expected[i] + ", got " + adr.get(i), - expected[i], adr.get(i)); + assertEquals(expected[i], adr.get(i), + "At index " + i + ": expecting " + expected[i] + ", got " + adr.get(i)); } } @@ -151,8 +151,7 @@ public void testLongRoundTrips() { "fe80::8358:c945:7094:2e6c", "fe80::60d0:6eff:fece:7713", "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")) { IPv6Address addr = IPv6Address.valueOf(s); - assertEquals("Bad roundtrip on address: " + s, - addr, new IPv6Address(addr.toLongArray())); + assertEquals(addr, new IPv6Address(addr.toLongArray()), "Bad roundtrip on address: " + s); } } @@ -166,11 +165,9 @@ public void testInclusionAbove() { "dd:a:a:a:a:a:b:a", "dd:a:a:a:a:a:a:b")) { IPv6Address ipv6 = IPv6Address.valueOf(addr); assertFalse(r.contains(ipv6)); - assertTrue("for address " + ipv6, above(ipv6.toLongArray(), - r.getTop().toLongArray())); - assertFalse("for address " + ipv6, between(r.getBottom().toLongArray(), - r.getTop().toLongArray(), - ipv6.toLongArray())); + assertTrue(above(ipv6.toLongArray(), r.getTop().toLongArray()), "for address " + ipv6); + assertFalse(between(r.getBottom().toLongArray(), r.getTop().toLongArray(), ipv6.toLongArray()), + "for address " + ipv6); } } @@ -189,9 +186,8 @@ public void testInclusionBelow() { long[] bottomArr = r.getBottom().toLongArray(); long[] addrArr = ipv6.toLongArray(); - assertTrue("for address " + ipv6, above(bottomArr, addrArr)); - assertFalse("for address " + ipv6, between(bottomArr, - r.getTop().toLongArray(), addrArr)); + assertTrue(above(bottomArr, addrArr), "for address " + ipv6); + assertFalse(between(bottomArr, r.getTop().toLongArray(), addrArr), "for address " + ipv6); } } diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IpAddressRangeTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IpAddressRangeTest.java index fe2bde06482..e3134dedaef 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IpAddressRangeTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/ip/IpAddressRangeTest.java @@ -83,7 +83,7 @@ public void testSingleAddress() { public void testRange( Boolean expected, IpAddressRange range, IpAddress... addresses ) { for ( IpAddress ipa : addresses ) { - assertEquals( "Testing " + ipa + " in " + range, expected, range.contains(ipa)); + assertEquals(expected, range.contains(ipa), "Testing " + ipa + " in " + range); } } diff --git a/src/test/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUserTest.java b/src/test/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUserTest.java index 6c430d0a09a..7bd802b3b02 100644 --- a/src/test/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUserTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUserTest.java @@ -364,14 +364,14 @@ public void testMutingInJson() { JsonObject jObject = testUser.toJson().build(); Set mutedEmails = new HashSet<>(jObject.getJsonArray("mutedEmails").getValuesAs(JsonString::getString)); - assertTrue("Set contains two elements", mutedEmails.size() == 2); - assertTrue("Set contains REVOKEROLE", mutedEmails.contains("REVOKEROLE")); - assertTrue("Set contains ASSIGNROLE", mutedEmails.contains("ASSIGNROLE")); + assertTrue(mutedEmails.size() == 2, "Set contains two elements"); + assertTrue(mutedEmails.contains("REVOKEROLE"), "Set contains REVOKEROLE"); + assertTrue(mutedEmails.contains("ASSIGNROLE"), "Set contains ASSIGNROLE"); Set mutedNotifications = new HashSet<>(jObject.getJsonArray("mutedNotifications").getValuesAs(JsonString::getString)); - assertTrue("Set contains two elements", mutedNotifications.size() == 2); - assertTrue("Set contains REVOKEROLE", mutedNotifications.contains("REVOKEROLE")); - assertTrue("Set contains ASSIGNROLE", mutedNotifications.contains("ASSIGNROLE")); + assertTrue(mutedNotifications.size() == 2, "Set contains two elements"); + assertTrue(mutedNotifications.contains("REVOKEROLE"), "Set contains REVOKEROLE"); + assertTrue(mutedNotifications.contains("ASSIGNROLE"), "Set contains ASSIGNROLE"); } @Test @@ -401,10 +401,10 @@ public void testTypeTokenizer() { Type.tokenizeToSet(" ASSIGNROLE , CREATEDV,REVOKEROLE ") ) ); - assertTrue("typeSet contains 3 elements", typeSet.size() == 3); - assertTrue("typeSet contains ASSIGNROLE", typeSet.contains(Type.ASSIGNROLE)); - assertTrue("typeSet contains CREATEDV", typeSet.contains(Type.CREATEDV)); - assertTrue("typeSet contains REVOKEROLE", typeSet.contains(Type.REVOKEROLE)); + assertTrue(typeSet.size() == 3, "typeSet contains 3 elements"); + assertTrue(typeSet.contains(Type.ASSIGNROLE), "typeSet contains ASSIGNROLE"); + assertTrue(typeSet.contains(Type.CREATEDV), "typeSet contains CREATEDV"); + assertTrue(typeSet.contains(Type.REVOKEROLE), "typeSet contains REVOKEROLE"); } @Test diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java index a52c06edf5e..7e84cf19e6b 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java @@ -233,8 +233,8 @@ public void testDefaultOptions() throws CommandException { // The following is a pretty wierd way to test that the create date defaults to // now, but it works across date changes. - assertTrue( "When the supplied creation date is null, date shuld default to command execution time", - Math.abs(System.currentTimeMillis() - result.getCreateDate().toInstant().toEpochMilli()) < 1000 ); + assertTrue(Math.abs(System.currentTimeMillis() - result.getCreateDate().toInstant().toEpochMilli()) < 1000, + "When the supplied creation date is null, date should default to command execution time"); assertTrue( result.isPermissionRoot() ); assertTrue( result.isThemeRoot() ); diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateRoleCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateRoleCommandTest.java index b1b1636f8e2..533a9ed6bbd 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateRoleCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateRoleCommandTest.java @@ -89,7 +89,7 @@ public void testSuperUsersAddRoles() throws CommandException { CreateRoleCommand sut = new CreateRoleCommand(dvr, new DataverseRequest(normalUser,IpAddress.valueOf("89.17.33.33")), dv); engine.submit(sut); - assertTrue( "CreateRoleCommand did not call save on the created role.", saveCalled ); + assertTrue(saveCalled, "CreateRoleCommand did not call save on the created role."); } diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/GetLatestPublishedDatasetVersionCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/GetLatestPublishedDatasetVersionCommandTest.java index 935da493c35..2c9f050b92f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/GetLatestPublishedDatasetVersionCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/GetLatestPublishedDatasetVersionCommandTest.java @@ -29,9 +29,9 @@ public void testLatestPublishedNoDraft() throws CommandException { List versions = make10Versions(ds); ds.setVersions(versions); - assertEquals( 10l, engine.submit(new GetLatestPublishedDatasetVersionCommand(makeRequest(), ds)).getVersionNumber().longValue() ); - assertTrue( "Published datasets should require no permissions to view", - engine.getReqiredPermissionsForObjects().get(ds).isEmpty() ); + assertEquals(10L, engine.submit(new GetLatestPublishedDatasetVersionCommand(makeRequest(), ds)).getVersionNumber().longValue()); + assertTrue(engine.getReqiredPermissionsForObjects().get(ds).isEmpty(), + "Published datasets should require no permissions to view"); } @Test @@ -42,9 +42,9 @@ public void testLatestPublishedWithDraft() throws CommandException { versions.add( MocksFactory.makeDatasetVersion(ds.getCategories()) ); ds.setVersions(versions); - assertEquals( 10l, engine.submit(new GetLatestPublishedDatasetVersionCommand(makeRequest(), ds)).getVersionNumber().longValue() ); - assertTrue( "Published datasets should require no permissions to view", - engine.getReqiredPermissionsForObjects().get(ds).isEmpty() ); + assertEquals(10L, engine.submit(new GetLatestPublishedDatasetVersionCommand(makeRequest(), ds)).getVersionNumber().longValue()); + assertTrue(engine.getReqiredPermissionsForObjects().get(ds).isEmpty(), + "Published datasets should require no permissions to view"); } @Test diff --git a/src/test/java/edu/harvard/iq/dataverse/externaltools/ExternalToolTest.java b/src/test/java/edu/harvard/iq/dataverse/externaltools/ExternalToolTest.java index 4cec93581c2..ea8613b70bf 100644 --- a/src/test/java/edu/harvard/iq/dataverse/externaltools/ExternalToolTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/externaltools/ExternalToolTest.java @@ -29,13 +29,13 @@ public void testToJson() { externalTool.setId(42l); JsonObject jsonObject = externalTool.toJson().build(); System.out.println("result: " + jsonObject); - assertEquals("testToJson() with ExternalTool.DISPLAY_NAME", "myDisplayName", jsonObject.getString(ExternalTool.DISPLAY_NAME)); - assertEquals("testToJson() with ExternalTool.TOOL_NAME", "explorer", jsonObject.getString(ExternalTool.TOOL_NAME)); - assertEquals("testToJson() with ExternalTool.DESCRIPTION", "myDescription", jsonObject.getString(ExternalTool.DESCRIPTION)); - assertEquals("testToJson() with ExternalTool.TYPES", "explore", jsonObject.getJsonArray(ExternalTool.TYPES).getString(0)); - assertEquals("testToJson() with ExternalTool.TOOL_URL", "http://example.com", jsonObject.getString(ExternalTool.TOOL_URL)); - assertEquals("testToJson() with ExternalTool.TOOL_PARAMETERS", "{}", jsonObject.getString(ExternalTool.TOOL_PARAMETERS)); - assertEquals("testToJson() with ExternalTool.CONTENT_TYPE", DataFileServiceBean.MIME_TYPE_TSV_ALT, jsonObject.getString(ExternalTool.CONTENT_TYPE)); + assertEquals("myDisplayName", jsonObject.getString(ExternalTool.DISPLAY_NAME), "testToJson() with ExternalTool.DISPLAY_NAME"); + assertEquals("explorer", jsonObject.getString(ExternalTool.TOOL_NAME), "testToJson() with ExternalTool.TOOL_NAME"); + assertEquals("myDescription", jsonObject.getString(ExternalTool.DESCRIPTION), "testToJson() with ExternalTool.DESCRIPTION"); + assertEquals("explore", jsonObject.getJsonArray(ExternalTool.TYPES).getString(0), "testToJson() with ExternalTool.TYPES"); + assertEquals("http://example.com", jsonObject.getString(ExternalTool.TOOL_URL), "testToJson() with ExternalTool.TOOL_URL"); + assertEquals("{}", jsonObject.getString(ExternalTool.TOOL_PARAMETERS), "testToJson() with ExternalTool.TOOL_PARAMETERS"); + assertEquals(DataFileServiceBean.MIME_TYPE_TSV_ALT, jsonObject.getString(ExternalTool.CONTENT_TYPE), "testToJson() with ExternalTool.CONTENT_TYPE"); } } diff --git a/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/csv/CSVFileReaderTest.java b/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/csv/CSVFileReaderTest.java index 0d9f7d7ccce..fc066ef195e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/csv/CSVFileReaderTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/ingest/tabulardata/impl/plugins/csv/CSVFileReaderTest.java @@ -68,7 +68,7 @@ public void testRead() { } catch (IOException ex) { fail(); } - assertEquals("Error on line " + line, expLine, foundLine); + assertEquals(expLine, foundLine, "Error on line " + line); line++; } @@ -122,15 +122,15 @@ public void testVariables() { // OK, let's go through the individual variables: for (int i = 0; i < result.getVarQuantity(); i++) { - assertEquals("variable " + i + ":", expectedVariableNames[i], result.getDataVariables().get(i).getName()); + assertEquals(expectedVariableNames[i], result.getDataVariables().get(i).getName(), "variable " + i + ":"); - assertEquals("variable " + i + ":", expectedVariableTypes[i], result.getDataVariables().get(i).getType()); + assertEquals(expectedVariableTypes[i], result.getDataVariables().get(i).getType(), "variable " + i + ":"); - assertEquals("variable " + i + ":", expectedVariableIntervals[i], result.getDataVariables().get(i).getInterval()); + assertEquals(expectedVariableIntervals[i], result.getDataVariables().get(i).getInterval(), "variable " + i + ":"); - assertEquals("variable " + i + ":", expectedVariableFormatCategories[i], result.getDataVariables().get(i).getFormatCategory()); + assertEquals(expectedVariableFormatCategories[i], result.getDataVariables().get(i).getFormatCategory(), "variable " + i + ":"); - assertEquals("variable " + i + ":", expectedVariableFormats[i], result.getDataVariables().get(i).getFormat()); + assertEquals(expectedVariableFormats[i], result.getDataVariables().get(i).getFormat(), "variable " + i + ":"); } } @@ -197,7 +197,7 @@ public void testSubset() { Double[] columnVector = TabularSubsetGenerator.subsetDoubleVector(generatedTabInputStream, i, generatedDataTable.getCaseQuantity().intValue()); - assertArrayEquals("column " + i + ":", floatVectors[vectorCount++], columnVector); + assertArrayEquals(floatVectors[vectorCount++], columnVector, "column " + i + ":"); } // Discrete Numerics (aka, integers): @@ -231,7 +231,7 @@ public void testSubset() { Long[] columnVector = TabularSubsetGenerator.subsetLongVector(generatedTabInputStream, i, generatedDataTable.getCaseQuantity().intValue()); - assertArrayEquals("column " + i + ":", longVectors[vectorCount++], columnVector); + assertArrayEquals(longVectors[vectorCount++], columnVector, "column " + i + ":"); } // And finally, Strings: @@ -258,7 +258,7 @@ public void testSubset() { String[] columnVector = TabularSubsetGenerator.subsetStringVector(generatedTabInputStream, i, generatedDataTable.getCaseQuantity().intValue()); - assertArrayEquals("column " + i + ":", stringVectors[vectorCount++], columnVector); + assertArrayEquals(stringVectors[vectorCount++], columnVector, "column " + i + ":"); } } @@ -388,7 +388,7 @@ public void testVariableUNFs() { } } - assertEquals("Variable number " + i + ":", expectedUNFs[i], unf); + assertEquals(expectedUNFs[i], unf, "Variable number " + i + ":"); } } diff --git a/src/test/java/edu/harvard/iq/dataverse/util/BitSetTest.java b/src/test/java/edu/harvard/iq/dataverse/util/BitSetTest.java index 445c61e1857..475d986b63c 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/BitSetTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/BitSetTest.java @@ -117,9 +117,9 @@ public void testIntersect() { sut = sut1.copy().intersect(sut2); for ( short i : BitSet.allIndices() ) { if ( sut.isSet(i) ) { - assertTrue( "expected true at idx " + i, sut1.isSet(i) && sut2.isSet(i) ); + assertTrue(sut1.isSet(i) && sut2.isSet(i), "expected true at idx " + i); } else { - assertFalse( "expected false at idx " + i, sut1.isSet(i) && sut2.isSet(i) ); + assertFalse(sut1.isSet(i) && sut2.isSet(i), "expected false at idx " + i); } } } @@ -134,9 +134,9 @@ public void testXor() { sut = sut1.copy().xor(sut2); for ( short i : BitSet.allIndices() ) { if ( sut.isSet(i) ) { - assertTrue( "expected true at idx " + i, sut1.isSet(i) ^ sut2.isSet(i) ); + assertTrue(sut1.isSet(i) ^ sut2.isSet(i), "expected true at idx " + i); } else { - assertFalse( "expected false at idx " + i, sut1.isSet(i) ^ sut2.isSet(i) ); + assertFalse(sut1.isSet(i) ^ sut2.isSet(i), "expected false at idx " + i); } } } diff --git a/src/test/java/edu/harvard/iq/dataverse/util/LruCacheTest.java b/src/test/java/edu/harvard/iq/dataverse/util/LruCacheTest.java index 122cf39e2c3..697e4853c3f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/LruCacheTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/LruCacheTest.java @@ -76,14 +76,14 @@ public void testInvalidateWholeCache() { // prepare cache Long key = 0l; String value = "x"; - assertEquals("put value", value, sut.put(key, value)); - assertEquals("get value", value, sut.get(key)); + assertEquals(value, sut.put(key, value), "put value"); + assertEquals(value, sut.get(key), "get value"); // invalidate cache sut.invalidate(); // verify invalidation - assertEquals("verify that value is no longer here", null, sut.get(key)); + assertNull(sut.get(key), "verify that value is no longer here"); } @Test @@ -91,19 +91,19 @@ public void testInvalidateOneKeyOfCache() { // prepare cache Long key1 = 0l; String value1 = "x"; - assertEquals("put value 1", value1, sut.put(key1, value1)); - assertEquals("get value 1", value1, sut.get(key1)); + assertEquals(value1, sut.put(key1, value1), "put value 1"); + assertEquals(value1, sut.get(key1), "get value 1"); Long key2 = 1l; String value2 = "y"; - assertEquals("put value 2", value2, sut.put(key2, value2)); - assertEquals("get value 2", value2, sut.get(key2)); + assertEquals(value2, sut.put(key2, value2), "put value 2"); + assertEquals(value2, sut.get(key2), "get value 2"); // invalidate cache sut.invalidate(key1); // verify invalidation - assertEquals("verify that value 1 is no longer here", null, sut.get(key1)); - assertEquals("verify that value 2 still exists", value2, sut.get(key2)); + assertNull(sut.get(key1), "verify that value 1 is no longer here"); + assertEquals(value2, sut.get(key2), "verify that value 2 still exists"); } } diff --git a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonParserTest.java b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonParserTest.java index 6576c1cfd84..972fc9c41cd 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonParserTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonParserTest.java @@ -711,8 +711,8 @@ public void testEnum() throws JsonParseException { arr.add(entry.name()); } Set typesSet = new HashSet<>(JsonParser.parseEnumsFromArray(arr.build(), Type.class)); - assertTrue("Set contains two elements", typesSet.size() == 2); - assertTrue("Set contains REVOKEROLE", typesSet.contains(Type.REVOKEROLE)); - assertTrue("Set contains ASSIGNROLE", typesSet.contains(Type.ASSIGNROLE)); + assertEquals(2, typesSet.size(), "Set contains two elements"); + assertTrue(typesSet.contains(Type.REVOKEROLE), "Set contains REVOKEROLE"); + assertTrue(typesSet.contains(Type.ASSIGNROLE), "Set contains ASSIGNROLE"); } } diff --git a/src/test/java/edu/harvard/iq/dataverse/util/shapefile/ShapefileHandlerTest.java b/src/test/java/edu/harvard/iq/dataverse/util/shapefile/ShapefileHandlerTest.java index 482981264c4..b93028b6365 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/shapefile/ShapefileHandlerTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/shapefile/ShapefileHandlerTest.java @@ -130,17 +130,14 @@ public void testCreateZippedNonShapefile() throws IOException{ shp_handler.DEBUG= true; // Contains shapefile? - assertEquals(shp_handler.containsShapefile(), false); + assertFalse(shp_handler.containsShapefile()); // get file_groups Map Map> file_groups = shp_handler.getFileGroups(); - assertEquals("verify that the dict is not empty", file_groups.isEmpty(), false); - assertEquals("verify key existance", file_groups.containsKey("not-quite-a-shape"), true); - assertEquals("verify value of key", file_groups.get("not-quite-a-shape"), Arrays.asList("shp", "shx", "dbf", "pdf")); - - this.showFilesInTempFolder(this.tempFolder.getRoot().getAbsolutePath()); - + assertFalse(file_groups.isEmpty(), "verify that the dict is not empty"); + assertTrue(file_groups.containsKey("not-quite-a-shape"), "verify key existance"); + assertEquals(List.of("shp", "shx", "dbf", "pdf"), file_groups.get("not-quite-a-shape"), "verify value of key"); // Delete .zip zipfile_obj.delete(); @@ -166,8 +163,8 @@ public void testZippedTwoShapefiles() throws IOException{ ShapefileHandler shp_handler = new ShapefileHandler(new FileInputStream(zipfile_obj)); shp_handler.DEBUG= true; - assertEquals("verify shapefile existance", shp_handler.containsShapefile(), true); - assertEquals("verify that no error was found", shp_handler.errorFound, false); + assertTrue(shp_handler.containsShapefile(), "verify shapefile existance"); + assertFalse(shp_handler.errorFound, "verify that no error was found"); shp_handler.showFileGroups(); // if (true){ @@ -176,18 +173,15 @@ public void testZippedTwoShapefiles() throws IOException{ // get file_groups Map Map> file_groups = shp_handler.getFileGroups(); - assertEquals("verify that the dict is not empty", file_groups.isEmpty(), false); + assertFalse(file_groups.isEmpty(), "verify that the dict is not empty"); // Verify the keys - assertEquals("verify key existance of 'shape1'", file_groups.containsKey("shape1"), true); - assertEquals("verify key existance of 'shape2'", file_groups.containsKey("shape2"), true); + assertTrue(file_groups.containsKey("shape1"), "verify key existance of 'shape1'"); + assertTrue(file_groups.containsKey("shape2"), "verify key existance of 'shape2'"); // Verify the values - assertEquals("verify value of key 'shape1'", file_groups.get("shape1"), Arrays.asList("shp", "shx", "dbf", "prj", "fbn", "fbx")); - assertEquals("verify value of key 'shape2'", file_groups.get("shape2"), Arrays.asList("shp", "shx", "dbf", "prj", "txt", "pdf", ShapefileHandler.BLANK_EXTENSION)); - - this.showFilesInTempFolder(this.tempFolder.getRoot().getAbsolutePath()); - + assertEquals(file_groups.get("shape1"), Arrays.asList("shp", "shx", "dbf", "prj", "fbn", "fbx"), "verify value of key 'shape1'"); + assertEquals(file_groups.get("shape2"), Arrays.asList("shp", "shx", "dbf", "prj", "txt", "pdf", ShapefileHandler.BLANK_EXTENSION), "verify value of key 'shape2'"); // Rezip/Reorder the files File test_unzip_folder = Files.createDirectory(this.tempFolder.resolve("test_unzip")).toFile(); @@ -199,9 +193,9 @@ public void testZippedTwoShapefiles() throws IOException{ List rezipped_filenames = new ArrayList<>(); rezipped_filenames.addAll(Arrays.asList(test_unzip_folder.list())); msg("rezipped_filenames: " + rezipped_filenames); - List expected_filenames = Arrays.asList("shape1.zip", "shape2.zip", "shape2.txt", "shape2.pdf", "shape2", "README.MD", "shp_dictionary.xls", "notes"); - - assertEquals("verify that all files exist", rezipped_filenames.containsAll(rezipped_filenames), true); + List expected_filenames = Arrays.asList("shape1.zip", "shape2.zip", "shape2.txt", "shape2.pdf", "shape2", "README.MD", "shp_dictionary.xls", "notes"); + + assertTrue(rezipped_filenames.containsAll(expected_filenames), "verify that all files exist"); // Delete .zip zipfile_obj.delete(); @@ -221,21 +215,21 @@ public void testZippedShapefileWithExtraFiles() throws IOException{ // Pass the .zip to the ShapefileHandler ShapefileHandler shp_handler = new ShapefileHandler(new FileInputStream(zipfile_obj)); shp_handler.DEBUG= true; - - assertEquals("verify shapefile existance", shp_handler.containsShapefile(), true); + + assertTrue(shp_handler.containsShapefile(), "verify shapefile existance"); // get file_groups Map Map> file_groups = shp_handler.getFileGroups(); - - assertEquals("verify that the dict is not empty", file_groups.isEmpty(), false); + + assertFalse(file_groups.isEmpty(), "verify that the dict is not empty"); // Verify the keys - assertEquals("verify key existance of 'shape1'", file_groups.containsKey("shape1"), true); + assertTrue(file_groups.containsKey("shape1"), "verify key existance of 'shape1'"); // Verify the values - assertEquals("verify value of key 'shape1'", file_groups.get("shape1"), Arrays.asList("shp", "shx", "dbf", "prj", "pdf", "cpg", SHP_XML_EXTENSION)); - assertEquals("verify value of key 'README'", file_groups.get("README"), Arrays.asList("md")); - assertEquals("verify value of key 'shape_notes'", file_groups.get("shape_notes"), Arrays.asList("txt")); + assertEquals(List.of("shp", "shx", "dbf", "prj", "pdf", "cpg", SHP_XML_EXTENSION), file_groups.get("shape1"), "verify value of key 'shape1'"); + assertEquals(List.of("md"), file_groups.get("README"), "verify value of key 'README'"); + assertEquals(List.of("txt"), file_groups.get("shape_notes"), "verify value of key 'shape_notes'"); File unzip2Folder = Files.createDirectory(this.tempFolder.resolve("test_unzip2")).toFile(); // Rezip/Reorder the files @@ -248,9 +242,9 @@ public void testZippedShapefileWithExtraFiles() throws IOException{ rezipped_filenames.addAll(Arrays.asList(unzip2Folder.list())); msg("rezipped_filenames: " + rezipped_filenames); - List expected_filenames = Arrays.asList("shape1.zip", "scratch-for-unzip-12345", "shape1.pdf", "README.md", "shape_notes.txt"); - - assertEquals("verify that all files exist", expected_filenames.containsAll(rezipped_filenames), true); + List expected_filenames = Arrays.asList("shape1.zip", "scratch-for-unzip-12345", "shape1.pdf", "README.md", "shape_notes.txt"); + + assertTrue(expected_filenames.containsAll(rezipped_filenames), "verify that all files exist"); // Delete .zip zipfile_obj.delete(); From 7587b95eb67d5cc8b6f52e43a2e1d1b32397ba57 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Fri, 18 Aug 2023 18:22:52 +0200 Subject: [PATCH 091/173] doc(test): migrate testing guide to JUnit5 #9782 --- .../source/developers/testing.rst | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/doc/sphinx-guides/source/developers/testing.rst b/doc/sphinx-guides/source/developers/testing.rst index f788719c9c6..0f2eca84b62 100755 --- a/doc/sphinx-guides/source/developers/testing.rst +++ b/doc/sphinx-guides/source/developers/testing.rst @@ -47,12 +47,14 @@ Writing Unit Tests with JUnit ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We are aware that there are newer testing tools such as TestNG, but we use `JUnit `_ because it's tried and true. -We support both (legacy) JUnit 4.x tests (forming the majority of our tests) and -newer JUnit 5 based testing. +We support JUnit 5 based testing and require new tests written with it. +(Since Dataverse 6.0, we migrated all of our tests formerly based on JUnit 4.) -NOTE: When adding new tests, you should give JUnit 5 a go instead of adding more dependencies to JUnit 4.x. - -If writing tests is new to you, poke around existing unit tests which all end in ``Test.java`` and live under ``src/test``. Each test is annotated with ``@Test`` and should have at least one assertion which specifies the expected result. In Netbeans, you can run all the tests in it by clicking "Run" -> "Test File". From the test file, you should be able to navigate to the code that's being tested by right-clicking on the file and clicking "Navigate" -> "Go to Test/Tested class". Likewise, from the code, you should be able to use the same "Navigate" menu to go to the tests. +If writing tests is new to you, poke around existing unit tests which all end in ``Test.java`` and live under ``src/test``. +Each test is annotated with ``@Test`` and should have at least one assertion which specifies the expected result. +In Netbeans, you can run all the tests in it by clicking "Run" -> "Test File". +From the test file, you should be able to navigate to the code that's being tested by right-clicking on the file and clicking "Navigate" -> "Go to Test/Tested class". +Likewise, from the code, you should be able to use the same "Navigate" menu to go to the tests. NOTE: Please remember when writing tests checking possibly localized outputs to check against ``en_US.UTF-8`` and ``UTC`` l10n strings! @@ -62,22 +64,24 @@ Refactoring Code to Make It Unit-Testable Existing code is not necessarily written in a way that lends itself to easy testing. Generally speaking, it is difficult to write unit tests for both JSF "backing" beans (which end in ``Page.java``) and "service" beans (which end in ``Service.java``) because they require the database to be running in order to test them. If service beans can be exercised via API they can be tested with integration tests (described below) but a good technique for making the logic testable it to move code to "util beans" (which end in ``Util.java``) that operate on Plain Old Java Objects (POJOs). ``PrivateUrlUtil.java`` is a good example of moving logic from ``PrivateUrlServiceBean.java`` to a "util" bean to make the code testable. -Parameterized Tests and JUnit Theories -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Parameterized Tests +^^^^^^^^^^^^^^^^^^^ + Often times you will want to test a method multiple times with similar values. In order to avoid test bloat (writing a test for every data combination), JUnit offers Data-driven unit tests. This allows a test to be run for each set of defined data values. -JUnit 4 uses ``Parameterized.class`` and ``Theories.class``. For reference, take a look at issue https://github.com/IQSS/dataverse/issues/5619. - -JUnit 5 doesn't offer theories (see `jqwik `_ for this), but -greatly extended parameterized testing. Some guidance how to write those: +JUnit 5 offers great parameterized testing. Some guidance how to write those: - https://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests - https://www.baeldung.com/parameterized-tests-junit-5 - https://blog.codefx.org/libraries/junit-5-parameterized-tests/ -- See also some examples in our codebase. +- See also many examples in our codebase. + +Note that JUnit 5 also offers support for custom test parameter resolvers. This enables keeping tests cleaner, +as preparation might happen within some extension and the test code is more focused on the actual testing. +See https://junit.org/junit5/docs/current/user-guide/#extensions-parameter-resolution for more information. JUnit 5 Test Helper Extensions ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -116,11 +120,14 @@ In addition, there is a writeup on "The Testable Command" at https://github.com/ Running Non-Essential (Excluded) Unit Tests ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -You should be aware that some unit tests have been deemed "non-essential" and have been annotated with ``@Category(NonEssentialTests.class)`` and are excluded from the "dev" Maven profile, which is the default profile. All unit tests (that have not been annotated with ``@Ignore``), including these non-essential tests, are run from continuous integration systems such as Jenkins and GitHub Actions with the following ``mvn`` command that invokes a non-default profile: +You should be aware that some unit tests have been deemed "non-essential" and have been annotated with ``@Tag(Tags.NOT_ESSENTIAL_UNITTESTS)`` and are excluded from the "dev" Maven profile, which is the default profile. +All unit tests (that have not been annotated with ``@Disable``), including these non-essential tests, are run from continuous integration systems such as Jenkins and GitHub Actions with the following ``mvn`` command that invokes a non-default profile: ``mvn test -P all-unit-tests`` -Generally speaking, unit tests have been flagged as non-essential because they are slow or because they require an Internet connection. You should not feel obligated to run these tests continuously but you can use the ``mvn`` command above to run them. To iterate on the unit test in Netbeans and execute it with "Run -> Test File", you must temporarily comment out the annotation flagging the test as non-essential. +Generally speaking, unit tests have been flagged as non-essential because they are slow or because they require an Internet connection. +You should not feel obligated to run these tests continuously but you can use the ``mvn`` command above to run them. +To iterate on the unit test in Netbeans and execute it with "Run -> Test File", you must temporarily comment out the annotation flagging the test as non-essential. Integration Tests ----------------- From f0c67786b48fbcb3caa3028b0cad7dc4a68e48ae Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Fri, 18 Aug 2023 15:09:45 -0400 Subject: [PATCH 092/173] add workaround for FISH-7722: Failed to deploy war with @Stateless #8094 See https://github.com/payara/Payara/issues/6337 --- modules/container-base/src/main/docker/Dockerfile | 2 ++ scripts/installer/as-setup.sh | 3 +++ 2 files changed, 5 insertions(+) diff --git a/modules/container-base/src/main/docker/Dockerfile b/modules/container-base/src/main/docker/Dockerfile index 148c29e0ed1..97aa4cd2792 100644 --- a/modules/container-base/src/main/docker/Dockerfile +++ b/modules/container-base/src/main/docker/Dockerfile @@ -164,6 +164,8 @@ RUN < Date: Mon, 21 Aug 2023 13:02:55 +0200 Subject: [PATCH 093/173] build(test): fix overlooked assertEquals arg flips in HarvestingClientIT #9782 --- .../edu/harvard/iq/dataverse/api/HarvestingClientsIT.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/HarvestingClientsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/HarvestingClientsIT.java index 67d8e8dd668..7a3e779eb8a 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/HarvestingClientsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/HarvestingClientsIT.java @@ -228,10 +228,10 @@ public void testHarvestingClientRun() throws InterruptedException { + getClientResponse.prettyPrint()); // Check the values in the response: // a) Confirm that the harvest has completed: - assertEquals("Unexpected client status: "+clientStatus, "inActive", clientStatus); + assertEquals("inActive", clientStatus, "Unexpected client status: "+clientStatus); // b) Confirm that it has actually succeeded: - assertEquals("Last harvest not reported a success (took "+i+" seconds)", "SUCCESS", responseJsonPath.getString("data.lastResult")); + assertEquals("SUCCESS", responseJsonPath.getString("data.lastResult"), "Last harvest not reported a success (took "+i+" seconds)"); String harvestTimeStamp = responseJsonPath.getString("data.lastHarvest"); assertNotNull(harvestTimeStamp); From db07e9415423380accf5dc6a82dfa4203de9b7a1 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Mon, 21 Aug 2023 15:50:39 +0200 Subject: [PATCH 094/173] doc(test): add release note about JUnit5 migration #9782 --- doc/release-notes/9782-juni5-transition.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 doc/release-notes/9782-juni5-transition.md diff --git a/doc/release-notes/9782-juni5-transition.md b/doc/release-notes/9782-juni5-transition.md new file mode 100644 index 00000000000..b7ffcc0de0d --- /dev/null +++ b/doc/release-notes/9782-juni5-transition.md @@ -0,0 +1,7 @@ +# Migrating all test to JUnit 5 +With this release, we transition all of our test cases (see `src/test/`) to use JUnit 5 only. +Moving forward from JUnit 4 will allow writing tests in more concise and easier ways. +The tests themselves have not been altered, but updated to match JUnit 5 ways. +They have not been extended or dropped coverage; this is mostly a preparation of things to come in the future. +If you are writing tests in JUnit 4 in your feature branches, you need to migrate. +The development guides section of testing has been updated as well. From 0b9170061bea38115ed99be111095d69a195d989 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Mon, 21 Aug 2023 22:04:59 +0200 Subject: [PATCH 095/173] build(parent): add Maven enforcer rules to ban JUnit 4 #9782 --- modules/dataverse-parent/pom.xml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/modules/dataverse-parent/pom.xml b/modules/dataverse-parent/pom.xml index d0a3dd2d926..c321d688eaa 100644 --- a/modules/dataverse-parent/pom.xml +++ b/modules/dataverse-parent/pom.xml @@ -191,6 +191,7 @@ 3.2.1 3.4.1 1.3.0 + 3.3.0 3.1.2 1.6.13 @@ -253,6 +254,11 @@ maven-failsafe-plugin ${maven-failsafe-plugin.version} + + org.apache.maven.plugins + maven-enforcer-plugin + ${maven-enforcer-plugin.version} + org.apache.maven.plugins maven-checkstyle-plugin @@ -312,6 +318,32 @@ + + + org.apache.maven.plugins + maven-enforcer-plugin + + + no-junit4 + generate-test-resources + + enforce + + + + + + junit:junit:*:*:test + org.junit:junit:*:*:test + org.junit.vintage:*:*:*:test + + + + + + + +
    From e7af08cdef3f95a3a9ed762b415be38dac427ce7 Mon Sep 17 00:00:00 2001 From: Don Sizemore Date: Tue, 22 Aug 2023 16:07:30 -0400 Subject: [PATCH 105/173] #9340 final java mail edits per Kevin and Phil --- doc/release-notes/9340-payara5to6.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/release-notes/9340-payara5to6.md b/doc/release-notes/9340-payara5to6.md index aa44f4098d0..b2e6702f5e4 100644 --- a/doc/release-notes/9340-payara5to6.md +++ b/doc/release-notes/9340-payara5to6.md @@ -82,9 +82,9 @@ `sudo -u dataverse /usr/local/payara6/bin/asadmin start-domain` -1. Create a Java mail resource, pointing to your SMTP relay: +1. Create a Java mail resource, replacing "localhost" for mailhost with your mail relay server, and replacing "localhost" for fromaddress with the FQDN of your Dataverse server: - `sudo -u dataverse /usr/local/payara6/bin/create-javamail-resource --mailhost "$SMTP_SERVER" --mailuser "dataversenotify" --fromaddress "do-not-reply@${HOST_ADDRESS}" mail/notifyMailSession` + `sudo -u dataverse /usr/local/payara6/bin/asadmin create-javamail-resource --mailhost "localhost" --mailuser "dataversenotify" --fromaddress "do-not-reply@localhost" mail/notifyMailSession` 1. Create password aliases for your database, rserve and datacite jvm-options, if you're using them: From 926e6ea58a4442e3e4a605355479d43e65462e91 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Tue, 22 Aug 2023 17:01:00 -0400 Subject: [PATCH 106/173] double sleep in test #9260 --- src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java b/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java index 24faad34ac6..e67497ca662 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java @@ -813,7 +813,7 @@ public void testNestedSubtree() { .statusCode(OK.getStatusCode()); try { - Thread.sleep(2000); + Thread.sleep(4000); } catch (InterruptedException ex) { /** * This sleep is here because dataverseAlias2 is showing with From 70bd031f6cd2d61e25613d3f34ccfb4935ad8a33 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Tue, 22 Aug 2023 17:19:49 -0400 Subject: [PATCH 107/173] switch to SWORD 2.0.0 non-snapshot #9801 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b4636c9aac6..bcd0a0fae69 100644 --- a/pom.xml +++ b/pom.xml @@ -96,7 +96,7 @@ io.gdcc sword2-server - 2.0.0-SNAPSHOT + 2.0.0 From 8c259b528f91cb191558ee444231150f768777c1 Mon Sep 17 00:00:00 2001 From: Leonid Andreev Date: Tue, 22 Aug 2023 18:15:52 -0400 Subject: [PATCH 108/173] fixing the intermittently-failing FilesIT test. #9803 --- .../java/edu/harvard/iq/dataverse/api/FilesIT.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java index 137cbee6b36..1b34d908a16 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java @@ -1399,8 +1399,8 @@ public void testGetFileInfo() { createUser = UtilIT.createRandomUser(); String apiTokenRegular = UtilIT.getApiTokenFromResponse(createUser); - msg("Add tabular file"); - String pathToFile = "scripts/search/data/tabular/stata13-auto-withstrls.dta"; + msg("Add a non-tabular file"); + String pathToFile = "scripts/search/data/binary/trees.png"; Response addResponse = UtilIT.uploadFileViaNative(datasetId.toString(), pathToFile, apiToken); String dataFileId = addResponse.getBody().jsonPath().getString("data.files[0].dataFile.id"); @@ -1412,10 +1412,12 @@ public void testGetFileInfo() { getFileDataResponse.prettyPrint(); getFileDataResponse.then().assertThat() - .body("data.label", equalTo("stata13-auto-withstrls.dta")) - .body("data.dataFile.filename", equalTo("stata13-auto-withstrls.dta")) + .body("data.label", equalTo("trees.png")) + .body("data.dataFile.filename", equalTo("trees.png")) + .body("data.dataFile.contentType", equalTo("image/png")) + .body("data.dataFile.filesize", equalTo(8361)) .statusCode(OK.getStatusCode()); - + getFileDataResponse = UtilIT.getFileData(dataFileId, apiTokenRegular); getFileDataResponse.then().assertThat() .statusCode(BAD_REQUEST.getStatusCode()); From 562350328643e3dea502966a12dd86ed643e0361 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Wed, 23 Aug 2023 15:56:34 +0200 Subject: [PATCH 109/173] refactor(solr): base solrconfig.xml on latest vanilla Instead of keeping the XML file originating from Solr 7 around, let's put our customisations in the vanilla config. The indentation changed, so this looks like an "everything changed" thing. Aside from that, we are doing three changes: 1. Enable ClassicIndexSchemaFactory 2. Disable schemaless via "update.autoCreateFields:false" 3. Tweak our searches in /select request handler --- conf/solr/9.3.0/solrconfig.xml | 2586 +++++++++++++++----------------- 1 file changed, 1176 insertions(+), 1410 deletions(-) diff --git a/conf/solr/9.3.0/solrconfig.xml b/conf/solr/9.3.0/solrconfig.xml index 73535b5011c..b89315cdaa9 100644 --- a/conf/solr/9.3.0/solrconfig.xml +++ b/conf/solr/9.3.0/solrconfig.xml @@ -1,1410 +1,1176 @@ - - - - - - - - - 7.3.0 - - - - - - - - - - - - - - - - - - - - ${solr.data.dir:} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ${solr.lock.type:native} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ${solr.ulog.dir:} - ${solr.ulog.numVersionBuckets:65536} - - - - - ${solr.autoCommit.maxTime:15000} - false - - - - - - ${solr.autoSoftCommit.maxTime:-1} - - - - - - - - - - - - - - 1024 - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - 20 - - - 200 - - - - - - - - - - - - - - - - false - - - - - - - - - - - - - - - - - - - - - - explicit - 10 - edismax - 0.075 - - dvName^400 - authorName^180 - dvSubject^190 - dvDescription^180 - dvAffiliation^170 - title^130 - subject^120 - keyword^110 - topicClassValue^100 - dsDescriptionValue^90 - authorAffiliation^80 - publicationCitation^60 - producerName^50 - fileName^30 - fileDescription^30 - variableLabel^20 - variableName^10 - _text_^1.0 - - - dvName^200 - authorName^100 - dvSubject^100 - dvDescription^100 - dvAffiliation^100 - title^75 - subject^75 - keyword^75 - topicClassValue^75 - dsDescriptionValue^75 - authorAffiliation^75 - publicationCitation^75 - producerName^75 - - - - isHarvested:false^25000 - - - - - - - - - - - - - - - - - - explicit - json - true - - - - - - - - explicit - - - - - - _text_ - - - - - - - true - ignored_ - _text_ - - - - - - - - - text_general - - - - - - default - _text_ - solr.DirectSolrSpellChecker - - internal - - 0.5 - - 2 - - 1 - - 5 - - 4 - - 0.01 - - - - - - - - - - - - default - on - true - 10 - 5 - 5 - true - true - 10 - 5 - - - spellcheck - - - - - - - - - - true - - - tvComponent - - - - - - - - - - - - true - false - - - terms - - - - - - - - string - - - - - - explicit - - - elevator - - - - - - - - - - - 100 - - - - - - - - 70 - - 0.5 - - [-\w ,/\n\"']{20,200} - - - - - - - ]]> - ]]> - - - - - - - - - - - - - - - - - - - - - - - - ,, - ,, - ,, - ,, - ,]]> - ]]> - - - - - - 10 - .,!? - - - - - - - WORD - - - en - US - - - - - - - - - - - - - - [^\w-\.] - _ - - - - - - - yyyy-MM-dd'T'HH:mm:ss.SSSZ - yyyy-MM-dd'T'HH:mm:ss,SSSZ - yyyy-MM-dd'T'HH:mm:ss.SSS - yyyy-MM-dd'T'HH:mm:ss,SSS - yyyy-MM-dd'T'HH:mm:ssZ - yyyy-MM-dd'T'HH:mm:ss - yyyy-MM-dd'T'HH:mmZ - yyyy-MM-dd'T'HH:mm - yyyy-MM-dd HH:mm:ss.SSSZ - yyyy-MM-dd HH:mm:ss,SSSZ - yyyy-MM-dd HH:mm:ss.SSS - yyyy-MM-dd HH:mm:ss,SSS - yyyy-MM-dd HH:mm:ssZ - yyyy-MM-dd HH:mm:ss - yyyy-MM-dd HH:mmZ - yyyy-MM-dd HH:mm - yyyy-MM-dd - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/plain; charset=UTF-8 - - - - - ${velocity.template.base.dir:} - ${velocity.solr.resource.loader.enabled:true} - ${velocity.params.resource.loader.enabled:false} - - - - - 5 - - - - - - - - - - - - - - + + + + + + + + + 9.7 + + + + + + + + + + + ${solr.data.dir:} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${solr.lock.type:native} + + + + + + + + + + + + + + + + + + + + + ${solr.ulog.dir:} + ${solr.ulog.numVersionBuckets:65536} + + + + + ${solr.autoCommit.maxTime:15000} + false + + + + + + ${solr.autoSoftCommit.maxTime:-1} + + + + + + + + + + + + + + ${solr.max.booleanClauses:1024} + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + 20 + + + 200 + + + + + + + + + + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + explicit + 10 + + edismax + 0.075 + + dvName^400 + authorName^180 + dvSubject^190 + dvDescription^180 + dvAffiliation^170 + title^130 + subject^120 + keyword^110 + topicClassValue^100 + dsDescriptionValue^90 + authorAffiliation^80 + publicationCitation^60 + producerName^50 + fileName^30 + fileDescription^30 + variableLabel^20 + variableName^10 + _text_^1.0 + + + dvName^200 + authorName^100 + dvSubject^100 + dvDescription^100 + dvAffiliation^100 + title^75 + subject^75 + keyword^75 + topicClassValue^75 + dsDescriptionValue^75 + authorAffiliation^75 + publicationCitation^75 + producerName^75 + + + + isHarvested:false^25000 + + + + + + + + explicit + json + true + + + + + + + _text_ + + + + + + + text_general + + + + + + default + _text_ + solr.DirectSolrSpellChecker + + internal + + 0.5 + + 2 + + 1 + + 5 + + 4 + + 0.01 + + + + + + + + + + + + + + + + + + + + + 100 + + + + + + + + 70 + + 0.5 + + [-\w ,/\n\"']{20,200} + + + + + + + ]]> + ]]> + + + + + + + + + + + + + + + + + + + + + + + + ,, + ,, + ,, + ,, + ,]]> + ]]> + + + + + + 10 + .,!? + + + + + + + WORD + + + en + US + + + + + + + + + + + + + [^\w-\.] + _ + + + + + + + yyyy-MM-dd['T'[HH:mm[:ss[.SSS]][z + yyyy-MM-dd['T'[HH:mm[:ss[,SSS]][z + yyyy-MM-dd HH:mm[:ss[.SSS]][z + yyyy-MM-dd HH:mm[:ss[,SSS]][z + [EEE, ]dd MMM yyyy HH:mm[:ss] z + EEEE, dd-MMM-yy HH:mm:ss z + EEE MMM ppd HH:mm:ss [z ]yyyy + + + + + java.lang.String + text_general + + *_str + 256 + + + true + + + java.lang.Boolean + booleans + + + java.util.Date + pdates + + + java.lang.Long + java.lang.Integer + plongs + + + java.lang.Number + pdoubles + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 137f3196a2639bd60e20bd1de8c2949d0d2d46cf Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Wed, 23 Aug 2023 15:59:39 +0200 Subject: [PATCH 110/173] refactor(solr): optimize schema.xml for Solr 9 - No longer use Trie*Fields, switch all to point fields (Trie has been deprecated since 9) - Add some new field types added since Solr 9 came out --- conf/solr/9.3.0/schema.xml | 123 ++++++++++++++++++------------------- 1 file changed, 60 insertions(+), 63 deletions(-) diff --git a/conf/solr/9.3.0/schema.xml b/conf/solr/9.3.0/schema.xml index ceff082f418..3c15b659c4e 100644 --- a/conf/solr/9.3.0/schema.xml +++ b/conf/solr/9.3.0/schema.xml @@ -23,7 +23,7 @@ For more information, on how to customize this file, please see - http://lucene.apache.org/solr/guide/documents-fields-and-schema-design.html + https://solr.apache.org/guide/solr/latest/indexing-guide/schema-elements.html PERFORMANCE NOTE: this schema includes many optional features and should not be used for benchmarking. To improve performance one could @@ -38,7 +38,7 @@ catchall "text" field, and use that for searching. --> - + - - - - - - - - - + + @@ -163,7 +156,7 @@ - + @@ -200,7 +193,7 @@ - + @@ -208,9 +201,9 @@ - + - + @@ -218,10 +211,10 @@ - + - + @@ -658,7 +651,8 @@ + RESTRICTION: the glob-like pattern in the name attribute must have a "*" + only at the start or the end. --> @@ -666,19 +660,23 @@ - + + + + + + + - - - - + + @@ -724,43 +722,6 @@ field first in an ascending sort and last in a descending sort. --> - - - - - - - - - - - - - - - - + - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/conf/vagrant/etc/shibboleth/dataverse-idp-metadata.xml b/conf/vagrant/etc/shibboleth/dataverse-idp-metadata.xml deleted file mode 100644 index 67225b5e670..00000000000 --- a/conf/vagrant/etc/shibboleth/dataverse-idp-metadata.xml +++ /dev/null @@ -1,298 +0,0 @@ - - - - - - - - - - - - - - - - - - - - testshib.org - - TestShib Test IdP - TestShib IdP. Use this as a source of attributes - for your test SP. - https://www.testshib.org/images/testshib-transp.png - - - - - - - - MIIEDjCCAvagAwIBAgIBADANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJVUzEV - MBMGA1UECBMMUGVubnN5bHZhbmlhMRMwEQYDVQQHEwpQaXR0c2J1cmdoMREwDwYD - VQQKEwhUZXN0U2hpYjEZMBcGA1UEAxMQaWRwLnRlc3RzaGliLm9yZzAeFw0wNjA4 - MzAyMTEyMjVaFw0xNjA4MjcyMTEyMjVaMGcxCzAJBgNVBAYTAlVTMRUwEwYDVQQI - EwxQZW5uc3lsdmFuaWExEzARBgNVBAcTClBpdHRzYnVyZ2gxETAPBgNVBAoTCFRl - c3RTaGliMRkwFwYDVQQDExBpZHAudGVzdHNoaWIub3JnMIIBIjANBgkqhkiG9w0B - AQEFAAOCAQ8AMIIBCgKCAQEArYkCGuTmJp9eAOSGHwRJo1SNatB5ZOKqDM9ysg7C - yVTDClcpu93gSP10nH4gkCZOlnESNgttg0r+MqL8tfJC6ybddEFB3YBo8PZajKSe - 3OQ01Ow3yT4I+Wdg1tsTpSge9gEz7SrC07EkYmHuPtd71CHiUaCWDv+xVfUQX0aT - NPFmDixzUjoYzbGDrtAyCqA8f9CN2txIfJnpHE6q6CmKcoLADS4UrNPlhHSzd614 - kR/JYiks0K4kbRqCQF0Dv0P5Di+rEfefC6glV8ysC8dB5/9nb0yh/ojRuJGmgMWH - gWk6h0ihjihqiu4jACovUZ7vVOCgSE5Ipn7OIwqd93zp2wIDAQABo4HEMIHBMB0G - A1UdDgQWBBSsBQ869nh83KqZr5jArr4/7b+QazCBkQYDVR0jBIGJMIGGgBSsBQ86 - 9nh83KqZr5jArr4/7b+Qa6FrpGkwZzELMAkGA1UEBhMCVVMxFTATBgNVBAgTDFBl - bm5zeWx2YW5pYTETMBEGA1UEBxMKUGl0dHNidXJnaDERMA8GA1UEChMIVGVzdFNo - aWIxGTAXBgNVBAMTEGlkcC50ZXN0c2hpYi5vcmeCAQAwDAYDVR0TBAUwAwEB/zAN - BgkqhkiG9w0BAQUFAAOCAQEAjR29PhrCbk8qLN5MFfSVk98t3CT9jHZoYxd8QMRL - I4j7iYQxXiGJTT1FXs1nd4Rha9un+LqTfeMMYqISdDDI6tv8iNpkOAvZZUosVkUo - 93pv1T0RPz35hcHHYq2yee59HJOco2bFlcsH8JBXRSRrJ3Q7Eut+z9uo80JdGNJ4 - /SJy5UorZ8KazGj16lfJhOBXldgrhppQBb0Nq6HKHguqmwRfJ+WkxemZXzhediAj - Geka8nz8JjwxpUjAiSWYKLtJhGEaTqCYxCCX2Dw+dOTqUzHOZ7WKv4JXPK5G/Uhr - 8K/qhmFT2nIQi538n6rVYLeWj8Bbnl+ev0peYzxFyF5sQA== - - - - - - - - - - - - - - - urn:mace:shibboleth:1.0:nameIdentifier - urn:oasis:names:tc:SAML:2.0:nameid-format:transient - - - - - - - - - - - - - - - - MIIEDjCCAvagAwIBAgIBADANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJVUzEV - MBMGA1UECBMMUGVubnN5bHZhbmlhMRMwEQYDVQQHEwpQaXR0c2J1cmdoMREwDwYD - VQQKEwhUZXN0U2hpYjEZMBcGA1UEAxMQaWRwLnRlc3RzaGliLm9yZzAeFw0wNjA4 - MzAyMTEyMjVaFw0xNjA4MjcyMTEyMjVaMGcxCzAJBgNVBAYTAlVTMRUwEwYDVQQI - EwxQZW5uc3lsdmFuaWExEzARBgNVBAcTClBpdHRzYnVyZ2gxETAPBgNVBAoTCFRl - c3RTaGliMRkwFwYDVQQDExBpZHAudGVzdHNoaWIub3JnMIIBIjANBgkqhkiG9w0B - AQEFAAOCAQ8AMIIBCgKCAQEArYkCGuTmJp9eAOSGHwRJo1SNatB5ZOKqDM9ysg7C - yVTDClcpu93gSP10nH4gkCZOlnESNgttg0r+MqL8tfJC6ybddEFB3YBo8PZajKSe - 3OQ01Ow3yT4I+Wdg1tsTpSge9gEz7SrC07EkYmHuPtd71CHiUaCWDv+xVfUQX0aT - NPFmDixzUjoYzbGDrtAyCqA8f9CN2txIfJnpHE6q6CmKcoLADS4UrNPlhHSzd614 - kR/JYiks0K4kbRqCQF0Dv0P5Di+rEfefC6glV8ysC8dB5/9nb0yh/ojRuJGmgMWH - gWk6h0ihjihqiu4jACovUZ7vVOCgSE5Ipn7OIwqd93zp2wIDAQABo4HEMIHBMB0G - A1UdDgQWBBSsBQ869nh83KqZr5jArr4/7b+QazCBkQYDVR0jBIGJMIGGgBSsBQ86 - 9nh83KqZr5jArr4/7b+Qa6FrpGkwZzELMAkGA1UEBhMCVVMxFTATBgNVBAgTDFBl - bm5zeWx2YW5pYTETMBEGA1UEBxMKUGl0dHNidXJnaDERMA8GA1UEChMIVGVzdFNo - aWIxGTAXBgNVBAMTEGlkcC50ZXN0c2hpYi5vcmeCAQAwDAYDVR0TBAUwAwEB/zAN - BgkqhkiG9w0BAQUFAAOCAQEAjR29PhrCbk8qLN5MFfSVk98t3CT9jHZoYxd8QMRL - I4j7iYQxXiGJTT1FXs1nd4Rha9un+LqTfeMMYqISdDDI6tv8iNpkOAvZZUosVkUo - 93pv1T0RPz35hcHHYq2yee59HJOco2bFlcsH8JBXRSRrJ3Q7Eut+z9uo80JdGNJ4 - /SJy5UorZ8KazGj16lfJhOBXldgrhppQBb0Nq6HKHguqmwRfJ+WkxemZXzhediAj - Geka8nz8JjwxpUjAiSWYKLtJhGEaTqCYxCCX2Dw+dOTqUzHOZ7WKv4JXPK5G/Uhr - 8K/qhmFT2nIQi538n6rVYLeWj8Bbnl+ev0peYzxFyF5sQA== - - - - - - - - - - - - - - - - urn:mace:shibboleth:1.0:nameIdentifier - urn:oasis:names:tc:SAML:2.0:nameid-format:transient - - - - - TestShib Two Identity Provider - TestShib Two - http://www.testshib.org/testshib-two/ - - - Nate - Klingenstein - ndk@internet2.edu - - - - - - - - - - - - - - - - - - - - - - - - - TestShib Test SP - TestShib SP. Log into this to test your machine. - Once logged in check that all attributes that you expected have been - released. - https://www.testshib.org/images/testshib-transp.png - - - - - - - - MIIEPjCCAyagAwIBAgIBADANBgkqhkiG9w0BAQUFADB3MQswCQYDVQQGEwJVUzEV - MBMGA1UECBMMUGVubnN5bHZhbmlhMRMwEQYDVQQHEwpQaXR0c2J1cmdoMSIwIAYD - VQQKExlUZXN0U2hpYiBTZXJ2aWNlIFByb3ZpZGVyMRgwFgYDVQQDEw9zcC50ZXN0 - c2hpYi5vcmcwHhcNMDYwODMwMjEyNDM5WhcNMTYwODI3MjEyNDM5WjB3MQswCQYD - VQQGEwJVUzEVMBMGA1UECBMMUGVubnN5bHZhbmlhMRMwEQYDVQQHEwpQaXR0c2J1 - cmdoMSIwIAYDVQQKExlUZXN0U2hpYiBTZXJ2aWNlIFByb3ZpZGVyMRgwFgYDVQQD - Ew9zcC50ZXN0c2hpYi5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB - AQDJyR6ZP6MXkQ9z6RRziT0AuCabDd3x1m7nLO9ZRPbr0v1LsU+nnC363jO8nGEq - sqkgiZ/bSsO5lvjEt4ehff57ERio2Qk9cYw8XCgmYccVXKH9M+QVO1MQwErNobWb - AjiVkuhWcwLWQwTDBowfKXI87SA7KR7sFUymNx5z1aoRvk3GM++tiPY6u4shy8c7 - vpWbVfisfTfvef/y+galxjPUQYHmegu7vCbjYP3On0V7/Ivzr+r2aPhp8egxt00Q - XpilNai12LBYV3Nv/lMsUzBeB7+CdXRVjZOHGuQ8mGqEbsj8MBXvcxIKbcpeK5Zi - JCVXPfarzuriM1G5y5QkKW+LAgMBAAGjgdQwgdEwHQYDVR0OBBYEFKB6wPDxwYrY - StNjU5P4b4AjBVQVMIGhBgNVHSMEgZkwgZaAFKB6wPDxwYrYStNjU5P4b4AjBVQV - oXukeTB3MQswCQYDVQQGEwJVUzEVMBMGA1UECBMMUGVubnN5bHZhbmlhMRMwEQYD - VQQHEwpQaXR0c2J1cmdoMSIwIAYDVQQKExlUZXN0U2hpYiBTZXJ2aWNlIFByb3Zp - ZGVyMRgwFgYDVQQDEw9zcC50ZXN0c2hpYi5vcmeCAQAwDAYDVR0TBAUwAwEB/zAN - BgkqhkiG9w0BAQUFAAOCAQEAc06Kgt7ZP6g2TIZgMbFxg6vKwvDL0+2dzF11Onpl - 5sbtkPaNIcj24lQ4vajCrrGKdzHXo9m54BzrdRJ7xDYtw0dbu37l1IZVmiZr12eE - Iay/5YMU+aWP1z70h867ZQ7/7Y4HW345rdiS6EW663oH732wSYNt9kr7/0Uer3KD - 9CuPuOidBacospDaFyfsaJruE99Kd6Eu/w5KLAGG+m0iqENCziDGzVA47TngKz2v - PVA+aokoOyoz3b53qeti77ijatSEoKjxheBWpO+eoJeGq/e49Um3M2ogIX/JAlMa - Inh+vYSYngQB2sx9LGkR9KHaMKNIGCDehk93Xla4pWJx1w== - - - - - - - - - - - - - - - - - - - - - urn:oasis:names:tc:SAML:2.0:nameid-format:transient - urn:mace:shibboleth:1.0:nameIdentifier - - - - - - - - - - - - - - - - - - - - TestShib Two Service Provider - TestShib Two - http://www.testshib.org/testshib-two/ - - - Nate - Klingenstein - ndk@internet2.edu - - - - - - - diff --git a/conf/vagrant/etc/shibboleth/shibboleth2.xml b/conf/vagrant/etc/shibboleth/shibboleth2.xml deleted file mode 100644 index 946e73bdf6a..00000000000 --- a/conf/vagrant/etc/shibboleth/shibboleth2.xml +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - - - - - - - - - - SAML2 SAML1 - - - - SAML2 Local - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/conf/vagrant/etc/yum.repos.d/epel-apache-maven.repo b/conf/vagrant/etc/yum.repos.d/epel-apache-maven.repo deleted file mode 100644 index 1e0f8200040..00000000000 --- a/conf/vagrant/etc/yum.repos.d/epel-apache-maven.repo +++ /dev/null @@ -1,15 +0,0 @@ -# Place this file in your /etc/yum.repos.d/ directory - -[epel-apache-maven] -name=maven from apache foundation. -baseurl=http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-$releasever/$basearch/ -enabled=1 -skip_if_unavailable=1 -gpgcheck=0 - -[epel-apache-maven-source] -name=maven from apache foundation. - Source -baseurl=http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-$releasever/SRPMS -enabled=0 -skip_if_unavailable=1 -gpgcheck=0 diff --git a/conf/vagrant/etc/yum.repos.d/shibboleth.repo b/conf/vagrant/etc/yum.repos.d/shibboleth.repo deleted file mode 100644 index adf42185d8a..00000000000 --- a/conf/vagrant/etc/yum.repos.d/shibboleth.repo +++ /dev/null @@ -1,9 +0,0 @@ -[shibboleth] -name=Shibboleth (rockylinux8) -# Please report any problems to https://shibboleth.atlassian.net/jira -type=rpm-md -mirrorlist=https://shibboleth.net/cgi-bin/mirrorlist.cgi/rockylinux8 -gpgcheck=1 -gpgkey=https://shibboleth.net/downloads/service-provider/RPMS/repomd.xml.key - https://shibboleth.net/downloads/service-provider/RPMS/cantor.repomd.xml.key -enabled=1 diff --git a/conf/vagrant/var/lib/pgsql/data/pg_hba.conf b/conf/vagrant/var/lib/pgsql/data/pg_hba.conf deleted file mode 100644 index e3244686066..00000000000 --- a/conf/vagrant/var/lib/pgsql/data/pg_hba.conf +++ /dev/null @@ -1,74 +0,0 @@ -# PostgreSQL Client Authentication Configuration File -# =================================================== -# -# Refer to the "Client Authentication" section in the -# PostgreSQL documentation for a complete description -# of this file. A short synopsis follows. -# -# This file controls: which hosts are allowed to connect, how clients -# are authenticated, which PostgreSQL user names they can use, which -# databases they can access. Records take one of these forms: -# -# local DATABASE USER METHOD [OPTIONS] -# host DATABASE USER CIDR-ADDRESS METHOD [OPTIONS] -# hostssl DATABASE USER CIDR-ADDRESS METHOD [OPTIONS] -# hostnossl DATABASE USER CIDR-ADDRESS METHOD [OPTIONS] -# -# (The uppercase items must be replaced by actual values.) -# -# The first field is the connection type: "local" is a Unix-domain socket, -# "host" is either a plain or SSL-encrypted TCP/IP socket, "hostssl" is an -# SSL-encrypted TCP/IP socket, and "hostnossl" is a plain TCP/IP socket. -# -# DATABASE can be "all", "sameuser", "samerole", a database name, or -# a comma-separated list thereof. -# -# USER can be "all", a user name, a group name prefixed with "+", or -# a comma-separated list thereof. In both the DATABASE and USER fields -# you can also write a file name prefixed with "@" to include names from -# a separate file. -# -# CIDR-ADDRESS specifies the set of hosts the record matches. -# It is made up of an IP address and a CIDR mask that is an integer -# (between 0 and 32 (IPv4) or 128 (IPv6) inclusive) that specifies -# the number of significant bits in the mask. Alternatively, you can write -# an IP address and netmask in separate columns to specify the set of hosts. -# -# METHOD can be "trust", "reject", "md5", "password", "gss", "sspi", "krb5", -# "ident", "pam", "ldap" or "cert". Note that "password" sends passwords -# in clear text; "md5" is preferred since it sends encrypted passwords. -# -# OPTIONS are a set of options for the authentication in the format -# NAME=VALUE. The available options depend on the different authentication -# methods - refer to the "Client Authentication" section in the documentation -# for a list of which options are available for which authentication methods. -# -# Database and user names containing spaces, commas, quotes and other special -# characters must be quoted. Quoting one of the keywords "all", "sameuser" or -# "samerole" makes the name lose its special character, and just match a -# database or username with that name. -# -# This file is read on server startup and when the postmaster receives -# a SIGHUP signal. If you edit the file on a running system, you have -# to SIGHUP the postmaster for the changes to take effect. You can use -# "pg_ctl reload" to do that. - -# Put your actual configuration here -# ---------------------------------- -# -# If you want to allow non-local connections, you need to add more -# "host" records. In that case you will also need to make PostgreSQL listen -# on a non-local interface via the listen_addresses configuration parameter, -# or via the -i or -h command line switches. -# - - - -# TYPE DATABASE USER CIDR-ADDRESS METHOD - -# "local" is for Unix domain socket connections only -local all all trust -# IPv4 local connections: -host all all 127.0.0.1/32 trust -# IPv6 local connections: -host all all ::1/128 trust diff --git a/conf/vagrant/var/www/dataverse/error-documents/503.html b/conf/vagrant/var/www/dataverse/error-documents/503.html deleted file mode 100644 index 95a7dea4107..00000000000 --- a/conf/vagrant/var/www/dataverse/error-documents/503.html +++ /dev/null @@ -1 +0,0 @@ -

    Custom "site is unavailable" 503 page.

    diff --git a/doc/shib/shib.md b/doc/shib/shib.md index 2c178a93f35..9cff6d827e7 100644 --- a/doc/shib/shib.md +++ b/doc/shib/shib.md @@ -82,11 +82,7 @@ Run `service httpd restart`. ## Update/verify files under /etc/shibboleth -For /etc/shibboleth/shibboleth2.xml use the version from https://github.com/IQSS/dataverse/blob/master/conf/vagrant/etc/shibboleth/shibboleth2.xml but replace "pdurbin.pagekite.me" with the "shibtest.dataverse.org". - -Put https://github.com/IQSS/dataverse/blob/master/conf/vagrant/etc/shibboleth/dataverse-idp-metadata.xml at /etc/shibboleth/dataverse-idp-metadata.xml - -Put https://github.com/IQSS/dataverse/blob/master/conf/vagrant/etc/shibboleth/attribute-map.xml at +Get files from the Installation Guide. After making these changes, run `service shibd restart` and `service httpd restart`. diff --git a/scripts/vagrant/counter-processor-config.yaml b/doc/sphinx-guides/source/_static/developers/counter-processor-config.yaml similarity index 100% rename from scripts/vagrant/counter-processor-config.yaml rename to doc/sphinx-guides/source/_static/developers/counter-processor-config.yaml diff --git a/doc/sphinx-guides/source/admin/metadatacustomization.rst b/doc/sphinx-guides/source/admin/metadatacustomization.rst index 495e0a6f34e..4f737bd730b 100644 --- a/doc/sphinx-guides/source/admin/metadatacustomization.rst +++ b/doc/sphinx-guides/source/admin/metadatacustomization.rst @@ -414,12 +414,9 @@ Setting Up a Dev Environment for Testing You have several options for setting up a dev environment for testing metadata block changes: - Docker: See :doc:`/container/index`. -- Vagrant: See the :doc:`/developers/tools` section of the Developer Guide. - AWS deployment: See the :doc:`/developers/deployment` section of the Developer Guide. - Full dev environment: See the :doc:`/developers/dev-environment` section of the Developer Guide. -To get a clean environment in Vagrant, you'll be running ``vagrant destroy``. In Docker, you'll use ``docker rm``. For a full dev environment or AWS installation, you might find ``rebuild`` and related scripts at ``scripts/deploy/phoenix.dataverse.org`` useful. - Editing TSV files ~~~~~~~~~~~~~~~~~ diff --git a/doc/sphinx-guides/source/api/getting-started.rst b/doc/sphinx-guides/source/api/getting-started.rst index 544f0921bd7..a6f6c259a25 100644 --- a/doc/sphinx-guides/source/api/getting-started.rst +++ b/doc/sphinx-guides/source/api/getting-started.rst @@ -11,7 +11,7 @@ Servers You Can Test With Rather than using a production Dataverse installation, API users are welcome to use http://demo.dataverse.org for testing. You can email support@dataverse.org if you have any trouble with this server. -If you would rather have full control over your own test server, deployments to AWS, Docker, Vagrant, and more are covered in the :doc:`/developers/index` and the :doc:`/installation/index`. +If you would rather have full control over your own test server, deployments to AWS, Docker, and more are covered in the :doc:`/developers/index` and the :doc:`/installation/index`. Getting an API Token -------------------- diff --git a/doc/sphinx-guides/source/developers/intro.rst b/doc/sphinx-guides/source/developers/intro.rst index 7f4e8c1ba34..4a64c407fc1 100755 --- a/doc/sphinx-guides/source/developers/intro.rst +++ b/doc/sphinx-guides/source/developers/intro.rst @@ -52,7 +52,9 @@ Related Guides If you are a developer who wants to make use of the Dataverse Software APIs, please see the :doc:`/api/index`. If you have front-end UI questions, please see the :doc:`/style/index`. -If you are a sysadmin who likes to code, you may be interested in hacking on installation scripts mentioned in the :doc:`/installation/index`. We validate the installation scripts with :doc:`/developers/tools` such as `Vagrant `_ and Docker (see the :doc:`containers` section). +If you are a sysadmin who likes to code, you may be interested in hacking on installation scripts mentioned in the :doc:`/installation/index`. + +If you are a Docker enthusiasts, please check out the :doc:`/container/index`. Related Projects ---------------- diff --git a/doc/sphinx-guides/source/developers/make-data-count.rst b/doc/sphinx-guides/source/developers/make-data-count.rst index ada0f13bb2f..8eaa5c0d7f8 100644 --- a/doc/sphinx-guides/source/developers/make-data-count.rst +++ b/doc/sphinx-guides/source/developers/make-data-count.rst @@ -30,13 +30,11 @@ Full Setup The recommended way to work on the Make Data Count feature is to spin up an EC2 instance that has both the Dataverse Software and Counter Processor installed. Go to the :doc:`deployment` page for details on how to spin up an EC2 instance and make sure that your Ansible file is configured to install Counter Processor before running the "create" script. -(Alternatively, you can try installing Counter Processor in Vagrant. :download:`setup-counter-processor.sh <../../../../scripts/vagrant/setup-counter-processor.sh>` might help you get it installed.) - After you have spun to your EC2 instance, set ``:MDCLogPath`` so that the Dataverse installation creates a log for Counter Processor to operate on. For more on this database setting, see the :doc:`/installation/config` section of the Installation Guide. Next you need to have the Dataverse installation add some entries to the log that Counter Processor will operate on. To do this, click on some published datasets and download some files. -Next you should run Counter Processor to convert the log into a SUSHI report, which is in JSON format. Before running Counter Processor, you need to put a configuration file into place. As a starting point use :download:`counter-processor-config.yaml <../../../../scripts/vagrant/counter-processor-config.yaml>` and edit the file, paying particular attention to the following settings: +Next you should run Counter Processor to convert the log into a SUSHI report, which is in JSON format. Before running Counter Processor, you need to put a configuration file into place. As a starting point use :download:`counter-processor-config.yaml <../_static/developers/counter-processor-config.yaml>` and edit the file, paying particular attention to the following settings: - ``log_name_pattern`` You might want something like ``/usr/local/payara6/glassfish/domains/domain1/logs/counter_(yyyy-mm-dd).log`` - ``year_month`` You should probably set this to the current month. diff --git a/doc/sphinx-guides/source/developers/testing.rst b/doc/sphinx-guides/source/developers/testing.rst index 0f2eca84b62..acaeccf4f23 100755 --- a/doc/sphinx-guides/source/developers/testing.rst +++ b/doc/sphinx-guides/source/developers/testing.rst @@ -506,7 +506,6 @@ Browser-Based Testing Installation Testing ~~~~~~~~~~~~~~~~~~~~ -- Run `vagrant up` on a server to test the installer - Work with @donsizemore to automate testing of https://github.com/GlobalDataverseCommunityConsortium/dataverse-ansible Future Work on Load/Performance Testing diff --git a/doc/sphinx-guides/source/developers/tools.rst b/doc/sphinx-guides/source/developers/tools.rst index 238db7ce7b0..a21becd14cf 100755 --- a/doc/sphinx-guides/source/developers/tools.rst +++ b/doc/sphinx-guides/source/developers/tools.rst @@ -25,21 +25,6 @@ Maven With Maven installed you can run ``mvn package`` and ``mvn test`` from the command line. It can be downloaded from https://maven.apache.org -.. _vagrant: - -Vagrant -+++++++ - -Vagrant allows you to spin up a virtual machine running the Dataverse Software on your development workstation. You'll need to install Vagrant from https://www.vagrantup.com and VirtualBox from https://www.virtualbox.org. - -We assume you have already cloned the repo from https://github.com/IQSS/dataverse as explained in the :doc:`/developers/dev-environment` section. - -From the root of the git repo (where the ``Vagrantfile`` is), run ``vagrant up`` and eventually you should be able to reach a Dataverse installation at http://localhost:8888 (the ``forwarded_port`` indicated in the ``Vagrantfile``). - -Please note that running ``vagrant up`` for the first time should run the ``downloads/download.sh`` script for you to download required software such as an app server, Solr, etc. However, these dependencies change over time so it's a place to look if ``vagrant up`` was working but later fails. - -On Windows if you see an error like ``/usr/bin/python^M: bad interpreter`` you might need to run ``dos2unix`` on the installation scripts. - PlantUML ++++++++ diff --git a/scripts/vagrant/install-dataverse.sh b/scripts/vagrant/install-dataverse.sh deleted file mode 100644 index c9873f7d3ec..00000000000 --- a/scripts/vagrant/install-dataverse.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env bash - -if [ ! -z "$1" ]; then - MAILSERVER=$1 - MAILSERVER_ARG="--mailserver $MAILSERVER" -fi -WAR=/dataverse/target/dataverse*.war -if [ ! -f $WAR ]; then - echo "no war file found... building" - #echo "Installing nss on CentOS 6 to avoid java.security.KeyException while building war file: https://github.com/IQSS/dataverse/issues/2744" - #yum install -y nss - su $SUDO_USER -s /bin/sh -c "cd /dataverse && source /etc/profile.d/maven.sh && mvn -q package" -fi -cd /dataverse/scripts/installer - -# move any pre-existing `default.config` file out of the way to avoid overwriting -pid=$$ -if [ -e default.config ]; then - cp default.config tmp-${pid}-default.config -fi - -# Switch to newer Python-based installer -python3 ./install.py --noninteractive --config_file="default.config" - -if [ -e tmp-${pid}-default.config ]; then # if we moved it out, move it back - mv -f tmp-${pid}-default.config default.config -fi - -echo "If "vagrant up" was successful (check output above) Dataverse is running on port 8080 of the Linux machine running within Vagrant, but this port has been forwarded to port 8088 of the computer you ran "vagrant up" on. For this reason you should go to http://localhost:8088 to see the Dataverse app running." - -echo "Please also note that the installation script has now started Payara, but has not set up an autostart mechanism for it.\nTherefore, the next time this VM is started, Payara must be started manually.\nSee https://guides.dataverse.org/en/latest/installation/prerequisites.html#launching-payara-on-system-boot for details." diff --git a/scripts/vagrant/rpmbuild.sh b/scripts/vagrant/rpmbuild.sh deleted file mode 100755 index f10830afb5b..00000000000 --- a/scripts/vagrant/rpmbuild.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -rpm -Uvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-7.noarch.rpm -yum install -y rpm-build httpd-devel libapreq2-devel R-devel diff --git a/scripts/vagrant/setup-counter-processor.sh b/scripts/vagrant/setup-counter-processor.sh deleted file mode 100755 index a418e8d6251..00000000000 --- a/scripts/vagrant/setup-counter-processor.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash -echo "Setting up counter-processor" -echo "Installing dependencies" -yum -y install unzip vim-enhanced -yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -# EPEL provides Python 3.6.6, new enough (3.6.4 in .python-version) -yum -y install python36 jq -# "ensurepip" tip from https://stackoverflow.com/questions/50408941/recommended-way-to-install-pip3-on-centos7/52518512#52518512 -python3.6 -m ensurepip -# FIXME: actually use this dedicated "counter" user. -COUNTER_USER=counter -echo "Ensuring Unix user '$COUNTER_USER' exists" -useradd $COUNTER_USER || : -COMMIT='7974dad259465ba196ef639f48dea007cae8f9ac' -UNZIPPED_DIR="counter-processor-$COMMIT" -if [ ! -e $UNZIPPED_DIR ]; then - ZIP_FILE="${COMMIT}.zip" - echo "Downloading and unzipping $ZIP_FILE" - wget https://github.com/CDLUC3/counter-processor/archive/$ZIP_FILE - unzip $ZIP_FILE -fi -cd $UNZIPPED_DIR -echo "Installation of the GeoLite2 country database for counter-processor can no longer be automated. See the Installation Guide for the manual installation process." -pip3 install -r requirements.txt -# For now, parsing sample_logs/counter_2018-05-08.log -for i in `echo {00..31}`; do - # avoid errors like: No such file or directory: 'sample_logs/counter_2018-05-01.log' - touch sample_logs/counter_2018-05-$i.log -done -#LOG_GLOB="sample_logs/counter_2018-05-*.log" -#START_DATE="2018-05-08" -#END_DATE="2018-05-09" -CONFIG_FILE=/dataverse/scripts/vagrant/counter-processor-config.yaml python3.6 main.py diff --git a/scripts/vagrant/setup-solr.sh b/scripts/vagrant/setup-solr.sh deleted file mode 100755 index 749ec46364a..00000000000 --- a/scripts/vagrant/setup-solr.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -echo "Setting up Solr" -dnf install -qy lsof -SOLR_USER=solr -SOLR_HOME=/usr/local/solr -mkdir $SOLR_HOME -chown $SOLR_USER:$SOLR_USER $SOLR_HOME -su $SOLR_USER -s /bin/sh -c "cp /dataverse/downloads/solr-9.3.0.tgz $SOLR_HOME" -su $SOLR_USER -s /bin/sh -c "cd $SOLR_HOME && tar xfz solr-9.3.0.tgz" -su $SOLR_USER -s /bin/sh -c "cd $SOLR_HOME/solr-9.3.0/server/solr && cp -r configsets/_default . && mv _default collection1" -su $SOLR_USER -s /bin/sh -c "cp /dataverse/conf/solr/9.3.0/schema*.xml $SOLR_HOME/solr-9.3.0/server/solr/collection1/conf/" -su $SOLR_USER -s /bin/sh -c "cp /dataverse/conf/solr/9.3.0/solrconfig.xml $SOLR_HOME/solr-9.3.0/server/solr/collection1/conf/solrconfig.xml" -su $SOLR_USER -s /bin/sh -c "cd $SOLR_HOME/solr-9.3.0 && bin/solr start && bin/solr create_core -c collection1 -d server/solr/collection1/conf/" -cp /dataverse/doc/sphinx-guides/source/_static/installation/files/etc/init.d/solr /etc/init.d/solr -chmod 755 /etc/init.d/solr -/etc/init.d/solr stop -/etc/init.d/solr start -chkconfig solr on diff --git a/scripts/vagrant/setup.sh b/scripts/vagrant/setup.sh deleted file mode 100644 index 2e8f2f5e08b..00000000000 --- a/scripts/vagrant/setup.sh +++ /dev/null @@ -1,96 +0,0 @@ -#!/bin/bash -echo "Installing dependencies for Dataverse" - -# wget seems to be missing in box 'bento/centos-8.2' -dnf install -qy wget - -# python3 and psycopg2 for the Dataverse installer -dnf install -qy python3 python3-psycopg2 - -# JQ -echo "Installing jq for the setup scripts" -dnf install -qy epel-release -dnf install -qy jq - -echo "Adding Shibboleth yum repo" -cp /dataverse/conf/vagrant/etc/yum.repos.d/shibboleth.repo /etc/yum.repos.d -# Uncomment this (and other shib stuff below) if you want -# to use Vagrant (and maybe PageKite) to test Shibboleth. -#yum install -y shibboleth shibboleth-embedded-ds - -# java configuration et alia -dnf install -qy java-11-openjdk-devel httpd mod_ssl unzip -alternatives --set java /usr/lib/jvm/jre-11-openjdk/bin/java -java -version - -# maven included in centos8 requires 1.8.0 - download binary instead -wget -q https://archive.apache.org/dist/maven/maven-3/3.8.2/binaries/apache-maven-3.8.2-bin.tar.gz -tar xfz apache-maven-3.8.2-bin.tar.gz -mkdir /opt/maven -mv apache-maven-3.8.2/* /opt/maven/ -echo "export JAVA_HOME=/usr/lib/jvm/jre-openjdk" > /etc/profile.d/maven.sh -echo "export M2_HOME=/opt/maven" >> /etc/profile.d/maven.sh -echo "export MAVEN_HOME=/opt/maven" >> /etc/profile.d/maven.sh -echo "export PATH=/opt/maven/bin:${PATH}" >> /etc/profile.d/maven.sh -chmod 0755 /etc/profile.d/maven.sh - -# disable centos8 postgresql module and install postgresql13-server -dnf -qy module disable postgresql -dnf install -qy https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm -dnf install -qy postgresql13-server -/usr/pgsql-13/bin/postgresql-13-setup initdb -/usr/bin/systemctl stop postgresql-13 -cp /dataverse/conf/vagrant/var/lib/pgsql/data/pg_hba.conf /var/lib/pgsql/13/data/pg_hba.conf -/usr/bin/systemctl start postgresql-13 -/usr/bin/systemctl enable postgresql-13 - -PAYARA_USER=dataverse -echo "Ensuring Unix user '$PAYARA_USER' exists" -useradd $PAYARA_USER || : -SOLR_USER=solr -echo "Ensuring Unix user '$SOLR_USER' exists" -useradd $SOLR_USER || : -DOWNLOAD_DIR='/dataverse/downloads' -PAYARA_ZIP="$DOWNLOAD_DIR/payara-6.2023.8.zip" -SOLR_TGZ="$DOWNLOAD_DIR/solr-9.3.0.tgz" -if [ ! -f $PAYARA_ZIP ] || [ ! -f $SOLR_TGZ ]; then - echo "Couldn't find $PAYARA_ZIP or $SOLR_TGZ! Running download script...." - cd $DOWNLOAD_DIR && ./download.sh && cd - echo "Done running download script." -fi -PAYARA_USER_HOME=~dataverse -PAYARA_ROOT=/usr/local/payara6 -if [ ! -d $PAYARA_ROOT ]; then - echo "Copying $PAYARA_ZIP to $PAYARA_USER_HOME and unzipping" - su $PAYARA_USER -s /bin/sh -c "cp $PAYARA_ZIP $PAYARA_USER_HOME" - su $PAYARA_USER -s /bin/sh -c "cd $PAYARA_USER_HOME && unzip -q $PAYARA_ZIP" - # default.config defaults to /usr/local/payara6 so let's go with that - rsync -a $PAYARA_USER_HOME/payara6/ $PAYARA_ROOT/ -else - echo "$PAYARA_ROOT already exists" -fi - -#service shibd start -/usr/bin/systemctl stop httpd -cp /dataverse/conf/httpd/conf.d/dataverse.conf /etc/httpd/conf.d/dataverse.conf -mkdir -p /var/www/dataverse/error-documents -cp /dataverse/conf/vagrant/var/www/dataverse/error-documents/503.html /var/www/dataverse/error-documents -/usr/bin/systemctl start httpd -#curl -k --sslv3 https://pdurbin.pagekite.me/Shibboleth.sso/Metadata > /tmp/pdurbin.pagekite.me -#cp -a /etc/shibboleth/shibboleth2.xml /etc/shibboleth/shibboleth2.xml.orig -#cp -a /etc/shibboleth/attribute-map.xml /etc/shibboleth/attribute-map.xml.orig -# need more attributes, such as sn, givenName, mail -#cp /dataverse/conf/vagrant/etc/shibboleth/attribute-map.xml /etc/shibboleth/attribute-map.xml -# FIXME: automate this? -#curl 'https://www.testshib.org/cgi-bin/sp2config.cgi?dist=Others&hostname=pdurbin.pagekite.me' > /etc/shibboleth/shibboleth2.xml -#cp /dataverse/conf/vagrant/etc/shibboleth/shibboleth2.xml /etc/shibboleth/shibboleth2.xml -#service shibd restart -#curl -k --sslv3 https://pdurbin.pagekite.me/Shibboleth.sso/Metadata > /downloads/pdurbin.pagekite.me -#service httpd restart - -echo "#########################################################################################" -echo "# This is a Vagrant test box, so we're disabling firewalld. # -echo "# Re-enable it with $ sudo systemctl enable firewalld && sudo systemctl start firewalld #" -echo "#########################################################################################" -systemctl disable firewalld -systemctl stop firewalld From 8866e38d614a2416eedef2a470efd6b48baefa3b Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Mon, 28 Aug 2023 16:23:07 -0400 Subject: [PATCH 128/173] remove download.sh (used by vagrant) #9838 The download.sh script was originally added in 294006e9 to support Vagrant in but now that we have removed Vagrant, it is unnecessary. We are moving the entire "downloads" directory, including Stata14TestFile.dta, which isn't used by any test. It was added in 9e7c40b8. --- downloads/.gitignore | 4 ---- downloads/download.sh | 5 ----- .../stata-13-test-files/Stata14TestFile.dta | Bin 4745 -> 0 bytes 3 files changed, 9 deletions(-) delete mode 100644 downloads/.gitignore delete mode 100755 downloads/download.sh delete mode 100644 downloads/stata-13-test-files/Stata14TestFile.dta diff --git a/downloads/.gitignore b/downloads/.gitignore deleted file mode 100644 index c21ee37922f..00000000000 --- a/downloads/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -payara-6.2023.6.zip -solr-7.3.0.tgz -weld-osgi-bundle-2.2.10.Final-glassfish4.jar -schemaSpy_5.0.0.jar diff --git a/downloads/download.sh b/downloads/download.sh deleted file mode 100755 index 38dd1407d5a..00000000000 --- a/downloads/download.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh -curl -L -O https://nexus.payara.fish/repository/payara-community/fish/payara/distributions/payara/6.2023.8/payara-6.2023.8.zip -curl -L -O https://archive.apache.org/dist/solr/solr/9.3.0/solr-9.3.0.tgz -curl -L -O https://search.maven.org/remotecontent?filepath=org/jboss/weld/weld-osgi-bundle/2.2.10.Final/weld-osgi-bundle-2.2.10.Final-glassfish4.jar -curl -s -L http://sourceforge.net/projects/schemaspy/files/schemaspy/SchemaSpy%205.0.0/schemaSpy_5.0.0.jar/download > schemaSpy_5.0.0.jar diff --git a/downloads/stata-13-test-files/Stata14TestFile.dta b/downloads/stata-13-test-files/Stata14TestFile.dta deleted file mode 100644 index 6f1c31dc79865fbb138276ed2446fe0233e00043..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4745 zcmeHLUuYCZ82_R%{y}UEMo83n6#{wCY)*)#b-J!GL~C*}nxH7?WwIG_+iq^d?j$A9 zViXagwQqfCp%g*z!3Q5&kiMkgg9wT*g(~8U54MO(sUV2pIkPk0-R_zr;>*3{4oN}5SlHrHc&I_qBO1TcIH!>qGAfy-zC%Y{mgO^( zEHIZtEv$yug;#~w1!5$GQaMk>%b5e>U%9W)|2~!%eN>^~GVGuiINb5_6-!~yID?8N z(Bn;saWgE2dWCAxEv9M(!^;_8oDd}NeC|2{FV5pHKnzib7)1d&<@pno2WIPM!G~0A z_WMu38Ua8Ah#Mk5iRc^of^JQ34E+^s`UzzrCitvhDf6IW<{(kkY3meKsh=3 zg&$NtXg_-?P9q<&XorkNFd08dm-C1Ga)@D*{*Ye|rN6L%sDJ^GMnrx&M7@tnV5Br; z7qd^sFQ<=sm{$_Z*(LQBp)m|%IdzmHCiLWbm7E!+4L~?w0uweJd;az`Kz)nCb=nEi z=<}c6`lWJff^xWgVfcZt`}1jC*wuHgHZ7C#Iy7kbb|{o@RDPFg`x}KJiGy^XCGB4Ei5w#JzxBh&i@xsg9r{Q2=Q*n5HUnT90@4xe~#yV3N z%sH;;rHuFud8c@)hfT{)Yl7P+vX_p}ud>!bKMRk)NtI^U+W40>*WO?~EA-HOenxp2 z^u4c`%~Siu^~(l$v3hQ1*WUHk{ldN}aaS_!NiW09&ZYW=Ts*hI-76=5T=ILf)dm^L zd5(RP473r}95$~0e|EFg0vYDp;zpuZ<``)$u;ZTp_pi4;wZw^?a^JDPmR_Q58yJ85 zd--Df7VB{#!{j@MUJf&xP0I7NsP-nvzPYmV(NFWc Date: Mon, 28 Aug 2023 16:32:48 -0400 Subject: [PATCH 129/173] add release note about Vagrant removal #9838 --- doc/release-notes/9838-rm-vagrant.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/release-notes/9838-rm-vagrant.md diff --git a/doc/release-notes/9838-rm-vagrant.md b/doc/release-notes/9838-rm-vagrant.md new file mode 100644 index 00000000000..910f2e0b2f0 --- /dev/null +++ b/doc/release-notes/9838-rm-vagrant.md @@ -0,0 +1 @@ +Vagrant has been removed. See #9838. From f42fd11cd543913c76741fb5a9758574bf61447e Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Mon, 28 Aug 2023 16:49:44 -0400 Subject: [PATCH 130/173] add note about :MDCLogPath, Payara 5 vs 6 #9822 --- doc/release-notes/9340-payara5to6.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/release-notes/9340-payara5to6.md b/doc/release-notes/9340-payara5to6.md index b2e6702f5e4..e71ace0ec24 100644 --- a/doc/release-notes/9340-payara5to6.md +++ b/doc/release-notes/9340-payara5to6.md @@ -76,6 +76,10 @@ `sudo -u dataverse vi /usr/local/payara6/glassfish/domains/domain1/config/jhove.conf` +1. If you are using Make Data Count (MDC), edit :MDCLogPath + + Your `:MDCLogPath` database setting might be pointing to a Payara 5 directory such as `/usr/local/payara5/glassfish/domains/domain1/logs`. If so, edit this to be Payara 6. You'll probably want to copy your logs over as well. + 1. Update systemd unit file (or other init system) from `/usr/local/payara5` to `/usr/local/payara6`, if applicable. 1. Start Payara: From c5b7da04a172d8eed5cf300b3779534250b779ee Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Mon, 28 Aug 2023 17:08:13 -0400 Subject: [PATCH 131/173] get FITS jar from Maven Central, not local_lib #9808 --- .../fits-2012-10-25-generated.jar | Bin 226093 -> 0 bytes .../fits-2012-10-25-generated.jar.md5 | 1 - .../fits-2012-10-25-generated.jar.sha1 | 1 - .../fits-2012-10-25-generated.pom | 8 -------- .../fits-2012-10-25-generated.pom.md5 | 1 - .../fits-2012-10-25-generated.pom.sha1 | 1 - local_lib/nom/tam/fits/fits/maven-metadata.xml | 12 ------------ .../nom/tam/fits/fits/maven-metadata.xml.md5 | 1 - .../nom/tam/fits/fits/maven-metadata.xml.sha1 | 1 - pom.xml | 8 ++++---- 10 files changed, 4 insertions(+), 30 deletions(-) delete mode 100644 local_lib/nom/tam/fits/fits/2012-10-25-generated/fits-2012-10-25-generated.jar delete mode 100644 local_lib/nom/tam/fits/fits/2012-10-25-generated/fits-2012-10-25-generated.jar.md5 delete mode 100644 local_lib/nom/tam/fits/fits/2012-10-25-generated/fits-2012-10-25-generated.jar.sha1 delete mode 100644 local_lib/nom/tam/fits/fits/2012-10-25-generated/fits-2012-10-25-generated.pom delete mode 100644 local_lib/nom/tam/fits/fits/2012-10-25-generated/fits-2012-10-25-generated.pom.md5 delete mode 100644 local_lib/nom/tam/fits/fits/2012-10-25-generated/fits-2012-10-25-generated.pom.sha1 delete mode 100644 local_lib/nom/tam/fits/fits/maven-metadata.xml delete mode 100644 local_lib/nom/tam/fits/fits/maven-metadata.xml.md5 delete mode 100644 local_lib/nom/tam/fits/fits/maven-metadata.xml.sha1 diff --git a/local_lib/nom/tam/fits/fits/2012-10-25-generated/fits-2012-10-25-generated.jar b/local_lib/nom/tam/fits/fits/2012-10-25-generated/fits-2012-10-25-generated.jar deleted file mode 100644 index b3bddd62c24ad6320338dc604bb0e7f45d9273d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 226093 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 - - 4.0.0 - nom.tam.fits - fits - 2012-10-25-generated - diff --git a/local_lib/nom/tam/fits/fits/2012-10-25-generated/fits-2012-10-25-generated.pom.md5 b/local_lib/nom/tam/fits/fits/2012-10-25-generated/fits-2012-10-25-generated.pom.md5 deleted file mode 100644 index 777b4df3325..00000000000 --- a/local_lib/nom/tam/fits/fits/2012-10-25-generated/fits-2012-10-25-generated.pom.md5 +++ /dev/null @@ -1 +0,0 @@ -23ca47c46df791f220a87cfef3b2190c diff --git a/local_lib/nom/tam/fits/fits/2012-10-25-generated/fits-2012-10-25-generated.pom.sha1 b/local_lib/nom/tam/fits/fits/2012-10-25-generated/fits-2012-10-25-generated.pom.sha1 deleted file mode 100644 index b5f41fd1a69..00000000000 --- a/local_lib/nom/tam/fits/fits/2012-10-25-generated/fits-2012-10-25-generated.pom.sha1 +++ /dev/null @@ -1 +0,0 @@ -c1ec9dfbbc72dc4623d309d772b804e47284ee27 diff --git a/local_lib/nom/tam/fits/fits/maven-metadata.xml b/local_lib/nom/tam/fits/fits/maven-metadata.xml deleted file mode 100644 index 4fc3254df3f..00000000000 --- a/local_lib/nom/tam/fits/fits/maven-metadata.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - nom.tam.fits - fits - - 2012-10-25-generated - - 2012-10-25-generated - - 20130925190525 - - diff --git a/local_lib/nom/tam/fits/fits/maven-metadata.xml.md5 b/local_lib/nom/tam/fits/fits/maven-metadata.xml.md5 deleted file mode 100644 index b6d7e4a726f..00000000000 --- a/local_lib/nom/tam/fits/fits/maven-metadata.xml.md5 +++ /dev/null @@ -1 +0,0 @@ -545c78160393b4c80e40377f2a7cf406 \ No newline at end of file diff --git a/local_lib/nom/tam/fits/fits/maven-metadata.xml.sha1 b/local_lib/nom/tam/fits/fits/maven-metadata.xml.sha1 deleted file mode 100644 index 188cf8ae044..00000000000 --- a/local_lib/nom/tam/fits/fits/maven-metadata.xml.sha1 +++ /dev/null @@ -1 +0,0 @@ -9cf56b8ef3f2bacdc669c2c7cdcd7cd50ed38dbb \ No newline at end of file diff --git a/pom.xml b/pom.xml index c4e50e64c5b..97c18a330f3 100644 --- a/pom.xml +++ b/pom.xml @@ -290,11 +290,11 @@ colt 1.2.0
    - + - nom.tam.fits - fits - 2012-10-25-generated + gov.nasa.gsfc.heasarc + nom-tam-fits + 1.18.0 net.handle From 58f85e84e5e2edf4eb022c6b30d686ae8a3d79f6 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Mon, 28 Aug 2023 17:18:15 -0400 Subject: [PATCH 132/173] remove unused titanium json ld jar from local_lib #9807 It was already upgraded from the 1.3.0 snapshot to 1.3.2 in a4a6d230d65. --- .../titanium-json-ld-1.3.0-SNAPSHOT.jar | Bin 287076 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 local_lib/com/apicatalog/titanium-json-ld/1.3.0-SNAPSHOT/titanium-json-ld-1.3.0-SNAPSHOT.jar diff --git a/local_lib/com/apicatalog/titanium-json-ld/1.3.0-SNAPSHOT/titanium-json-ld-1.3.0-SNAPSHOT.jar b/local_lib/com/apicatalog/titanium-json-ld/1.3.0-SNAPSHOT/titanium-json-ld-1.3.0-SNAPSHOT.jar deleted file mode 100644 index ee499ae4b76e473e12c1e41570a1dd189e328a8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 287076 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 q?vOaDez Date: Tue, 29 Aug 2023 09:18:51 -0400 Subject: [PATCH 133/173] remove UNF 5 (unused) #9810 As the comment in the pom said, it was only added for testing: "UNF v5 (buggy), (temporarily) added for testing ingest against DVN v3 - L.A." --- .../edu/harvard/iq/dvn/unf5/5.0/unf5-5.0.jar | Bin 101590 -> 0 bytes .../harvard/iq/dvn/unf5/5.0/unf5-5.0.jar.md5 | 1 - .../harvard/iq/dvn/unf5/5.0/unf5-5.0.jar.sha1 | 1 - .../edu/harvard/iq/dvn/unf5/5.0/unf5-5.0.pom | 8 -------- .../harvard/iq/dvn/unf5/5.0/unf5-5.0.pom.md5 | 1 - .../harvard/iq/dvn/unf5/5.0/unf5-5.0.pom.sha1 | 1 - pom.xml | 6 ------ 7 files changed, 18 deletions(-) delete mode 100644 local_lib/edu/harvard/iq/dvn/unf5/5.0/unf5-5.0.jar delete mode 100644 local_lib/edu/harvard/iq/dvn/unf5/5.0/unf5-5.0.jar.md5 delete mode 100644 local_lib/edu/harvard/iq/dvn/unf5/5.0/unf5-5.0.jar.sha1 delete mode 100644 local_lib/edu/harvard/iq/dvn/unf5/5.0/unf5-5.0.pom delete mode 100644 local_lib/edu/harvard/iq/dvn/unf5/5.0/unf5-5.0.pom.md5 delete mode 100644 local_lib/edu/harvard/iq/dvn/unf5/5.0/unf5-5.0.pom.sha1 diff --git a/local_lib/edu/harvard/iq/dvn/unf5/5.0/unf5-5.0.jar b/local_lib/edu/harvard/iq/dvn/unf5/5.0/unf5-5.0.jar deleted file mode 100644 index dc41f94046f098e3be82f580248dae4b8fc765f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101590 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 - - 4.0.0 - edu.harvard.iq.dvn - unf5 - 5.0 - diff --git a/local_lib/edu/harvard/iq/dvn/unf5/5.0/unf5-5.0.pom.md5 b/local_lib/edu/harvard/iq/dvn/unf5/5.0/unf5-5.0.pom.md5 deleted file mode 100644 index a88cf2a1c02..00000000000 --- a/local_lib/edu/harvard/iq/dvn/unf5/5.0/unf5-5.0.pom.md5 +++ /dev/null @@ -1 +0,0 @@ -2df5dac09375e1e7fcd66c705d9ca2ef diff --git a/local_lib/edu/harvard/iq/dvn/unf5/5.0/unf5-5.0.pom.sha1 b/local_lib/edu/harvard/iq/dvn/unf5/5.0/unf5-5.0.pom.sha1 deleted file mode 100644 index 967b977b79e..00000000000 --- a/local_lib/edu/harvard/iq/dvn/unf5/5.0/unf5-5.0.pom.sha1 +++ /dev/null @@ -1 +0,0 @@ -431cd55e2e9379677d14e402dd3c474bb7be4ac9 diff --git a/pom.xml b/pom.xml index c4e50e64c5b..6f7188d5740 100644 --- a/pom.xml +++ b/pom.xml @@ -301,12 +301,6 @@ handle-client 9.3.1 - - - edu.harvard.iq.dvn - unf5 - 5.0 - org.dataverse From acdaa891467ee1900aa9344f009ec948d38458af Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Tue, 29 Aug 2023 11:40:06 -0400 Subject: [PATCH 134/173] switch to UNF 6.0 on Maven Central (SNAPSHOT for now) #9810 --- local_lib/org/dataverse/unf/6.0/unf-6.0.jar | Bin 51515 -> 0 bytes local_lib/org/dataverse/unf/6.0/unf-6.0.jar.md5 | 1 - .../org/dataverse/unf/6.0/unf-6.0.jar.sha1 | 1 - local_lib/org/dataverse/unf/6.0/unf-6.0.pom | 8 -------- local_lib/org/dataverse/unf/6.0/unf-6.0.pom.md5 | 1 - .../org/dataverse/unf/6.0/unf-6.0.pom.sha1 | 1 - pom.xml | 2 +- 7 files changed, 1 insertion(+), 13 deletions(-) delete mode 100644 local_lib/org/dataverse/unf/6.0/unf-6.0.jar delete mode 100644 local_lib/org/dataverse/unf/6.0/unf-6.0.jar.md5 delete mode 100644 local_lib/org/dataverse/unf/6.0/unf-6.0.jar.sha1 delete mode 100644 local_lib/org/dataverse/unf/6.0/unf-6.0.pom delete mode 100644 local_lib/org/dataverse/unf/6.0/unf-6.0.pom.md5 delete mode 100644 local_lib/org/dataverse/unf/6.0/unf-6.0.pom.sha1 diff --git a/local_lib/org/dataverse/unf/6.0/unf-6.0.jar b/local_lib/org/dataverse/unf/6.0/unf-6.0.jar deleted file mode 100644 index d2738e2dadd165bc2c70be0be756014627946529..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51515 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 D@Miv_ diff --git a/local_lib/org/dataverse/unf/6.0/unf-6.0.jar.md5 b/local_lib/org/dataverse/unf/6.0/unf-6.0.jar.md5 deleted file mode 100644 index 04ca3e73ce8..00000000000 --- a/local_lib/org/dataverse/unf/6.0/unf-6.0.jar.md5 +++ /dev/null @@ -1 +0,0 @@ -bd9b84a9ad737a81a2699ab81541a901 diff --git a/local_lib/org/dataverse/unf/6.0/unf-6.0.jar.sha1 b/local_lib/org/dataverse/unf/6.0/unf-6.0.jar.sha1 deleted file mode 100644 index a48cef32570..00000000000 --- a/local_lib/org/dataverse/unf/6.0/unf-6.0.jar.sha1 +++ /dev/null @@ -1 +0,0 @@ -4cad279c362e4c5c17a2058dc2c8f2fc97c76bf8 diff --git a/local_lib/org/dataverse/unf/6.0/unf-6.0.pom b/local_lib/org/dataverse/unf/6.0/unf-6.0.pom deleted file mode 100644 index 06f1508723f..00000000000 --- a/local_lib/org/dataverse/unf/6.0/unf-6.0.pom +++ /dev/null @@ -1,8 +0,0 @@ - - - 4.0.0 - org.dataverse - unf - 6.0 - diff --git a/local_lib/org/dataverse/unf/6.0/unf-6.0.pom.md5 b/local_lib/org/dataverse/unf/6.0/unf-6.0.pom.md5 deleted file mode 100644 index 138bc9c95f6..00000000000 --- a/local_lib/org/dataverse/unf/6.0/unf-6.0.pom.md5 +++ /dev/null @@ -1 +0,0 @@ -230c5b1f5ae71bb2fe80ef9e7209f681 diff --git a/local_lib/org/dataverse/unf/6.0/unf-6.0.pom.sha1 b/local_lib/org/dataverse/unf/6.0/unf-6.0.pom.sha1 deleted file mode 100644 index 689e8045418..00000000000 --- a/local_lib/org/dataverse/unf/6.0/unf-6.0.pom.sha1 +++ /dev/null @@ -1 +0,0 @@ -286b819f2fc7432a94b5940c6171be1589f66a37 diff --git a/pom.xml b/pom.xml index c4e50e64c5b..26407c321f4 100644 --- a/pom.xml +++ b/pom.xml @@ -311,7 +311,7 @@ org.dataverse unf - 6.0 + 6.0-SNAPSHOT From 5875375fd95e2ae53d24b74ab8c37d6413d08603 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Tue, 29 Aug 2023 11:56:36 -0400 Subject: [PATCH 135/173] copy collection logos from payara5 to paraya6 #9822 --- doc/release-notes/9340-payara5to6.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/release-notes/9340-payara5to6.md b/doc/release-notes/9340-payara5to6.md index e71ace0ec24..68162ef7598 100644 --- a/doc/release-notes/9340-payara5to6.md +++ b/doc/release-notes/9340-payara5to6.md @@ -76,6 +76,12 @@ `sudo -u dataverse vi /usr/local/payara6/glassfish/domains/domain1/config/jhove.conf` +1. Copy logos from Payara 5 to Payara 6 + + These logos are for collections (dataverses). + + `sudo -u dataverse cp -r /usr/local/payara5/glassfish/domains/domain1/docroot/logos /usr/local/payara6/glassfish/domains/domain1/docroot` + 1. If you are using Make Data Count (MDC), edit :MDCLogPath Your `:MDCLogPath` database setting might be pointing to a Payara 5 directory such as `/usr/local/payara5/glassfish/domains/domain1/logs`. If so, edit this to be Payara 6. You'll probably want to copy your logs over as well. From d315af0ca94882a48286a5027818ff377991f4a3 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Tue, 29 Aug 2023 13:04:35 -0400 Subject: [PATCH 136/173] release note --- doc/release-notes/9812-archiver-warnings.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 doc/release-notes/9812-archiver-warnings.md diff --git a/doc/release-notes/9812-archiver-warnings.md b/doc/release-notes/9812-archiver-warnings.md new file mode 100644 index 00000000000..716223b3f46 --- /dev/null +++ b/doc/release-notes/9812-archiver-warnings.md @@ -0,0 +1,7 @@ +# Potential Archiver Incompatibilities with Payara6 +The Google Cloud and DuraCloud Archivers (see https://guides.dataverse.org/en/latest/installation/config.html#bagit-export) may not work in v6.0. +This is due to their dependence on libraries that include classes in javax.* packages that are no longer available. +If these classes are actually used when the archivers run, the archivers would fail. +As these two archivers require additional setup, they have not been tested in v6.0. +Community members using these archivers or considering their use are encouraged to test them with v6.0 and report any errors and/or provide fixes for them that can be included in future releases. + From 56a4666288667eb759ec4462f62c7e366654a79b Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Tue, 29 Aug 2023 16:43:04 -0400 Subject: [PATCH 137/173] get FITS working again #9808 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1258761dd4c..3ff313743d5 100644 --- a/pom.xml +++ b/pom.xml @@ -294,7 +294,7 @@ gov.nasa.gsfc.heasarc nom-tam-fits - 1.18.0 + 1.12.0 net.handle From 7c0c9523c9522f093c5c7231f98658d2d7795a5f Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Wed, 30 Aug 2023 09:36:29 -0400 Subject: [PATCH 138/173] add test for file-level FITS metadata extraction #9808 --- src/test/java/edu/harvard/iq/dataverse/api/FitsIT.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FitsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FitsIT.java index 763b61000d8..e788efc9c87 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FitsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FitsIT.java @@ -60,6 +60,7 @@ public void testAstroFieldsFromFits() throws IOException { getJson.prettyPrint(); getJson.then().assertThat() .statusCode(OK.getStatusCode()) + .body("data.latestVersion.files[0].description", equalTo("FITS file, 2 HDUs total:\nThe primary HDU; 1 Table HDU(s) 1 Image HDU(s); \nThe following recognized metadata keys have been found in the FITS file:\nCRVAL2; NAXIS; INSTRUME; NAXIS1; NAXIS0; EXPTIME; CD1_1; CRVAL1; TARGNAME; DATE-OBS; \n")) .body("data.latestVersion.metadataBlocks.astrophysics.fields[0].value[0]", equalTo("Image")); // a bit more precise than the check for "Image" above (but annoyingly fiddly) From cdc1dac5fe66ee7d7a43cc2016a385e4b942c1a2 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Wed, 30 Aug 2023 16:01:57 +0200 Subject: [PATCH 139/173] chore(deps): update to XOAI 5.1.0 for Jakarta EE 10 #9802 --- modules/dataverse-parent/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/dataverse-parent/pom.xml b/modules/dataverse-parent/pom.xml index 646d1ea8026..289abdde625 100644 --- a/modules/dataverse-parent/pom.xml +++ b/modules/dataverse-parent/pom.xml @@ -165,7 +165,7 @@ 4.4.14 - 5.0.0 + 5.1.0 1.15.0 From 358a5ffc369463302d611f2ac642bc6c5f4cc90c Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Wed, 30 Aug 2023 10:28:38 -0400 Subject: [PATCH 140/173] double sleepForReindex in test #9848 --- src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java index 37a1c04c71b..d0f20a8642b 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java @@ -1107,7 +1107,7 @@ public void testAccessFacet() { Response addResponse = UtilIT.uploadFileViaNative(datasetId.toString(), pathToFile, apiToken); // Wait a little while for the index to pick up the file, otherwise timing issue with searching for it. - UtilIT.sleepForReindex(datasetId.toString(), apiToken, 2); + UtilIT.sleepForReindex(datasetId.toString(), apiToken, 4); String successMsgAdd = BundleUtil.getStringFromBundle("file.addreplace.success.add"); From 11dd3a9397c12ff7f02a444e9d7d6628d2d4217b Mon Sep 17 00:00:00 2001 From: Leonid Andreev Date: Wed, 30 Aug 2023 10:58:15 -0400 Subject: [PATCH 141/173] A static 404 page to replace the dynamic 404.xhtml page that's been throwing errors under p6 on account of some conflict with prettyfaces rewrite. (#9770) --- .../iq/dataverse/NavigationWrapper.java | 3 +- src/main/webapp/404static.xhtml | 110 ++++++++++++++++++ src/main/webapp/WEB-INF/web.xml | 2 +- 3 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 src/main/webapp/404static.xhtml diff --git a/src/main/java/edu/harvard/iq/dataverse/NavigationWrapper.java b/src/main/java/edu/harvard/iq/dataverse/NavigationWrapper.java index d2c522b5c89..832d7ec19ef 100644 --- a/src/main/java/edu/harvard/iq/dataverse/NavigationWrapper.java +++ b/src/main/java/edu/harvard/iq/dataverse/NavigationWrapper.java @@ -96,7 +96,8 @@ private String sendError(int errorCode) { try { context.getExternalContext().responseSendError(errorCode,null); } catch (IOException ex) { - Logger.getLogger(PermissionsWrapper.class.getName()).log(Level.SEVERE, null, ex); + //Logger.getLogger(PermissionsWrapper.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(NavigationWrapper.class.getName()).fine("Caught exception in sendError(): "+ex.getMessage()); } context.responseComplete(); return ""; diff --git a/src/main/webapp/404static.xhtml b/src/main/webapp/404static.xhtml new file mode 100644 index 00000000000..7abf2feb49a --- /dev/null +++ b/src/main/webapp/404static.xhtml @@ -0,0 +1,110 @@ + + + + + Dataverse - Not Found + + + + + + + + + + + + + + + + + + + +

    +
    + + +
    +
    + + diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index f16da2c8e5b..427615f2f0b 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -7,7 +7,7 @@ 404 - /404.xhtml + /404static.xhtml 500 From b60c258c4ca8d935ddb2e1747e0f768d4a2affed Mon Sep 17 00:00:00 2001 From: Leonid Andreev Date: Wed, 30 Aug 2023 11:38:49 -0400 Subject: [PATCH 142/173] (Realized that I had the words "Harvard Dataverse" in that static page. Replaced them with the more neutral "Dataverse Project") #9770 --- src/main/webapp/404static.xhtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/webapp/404static.xhtml b/src/main/webapp/404static.xhtml index 7abf2feb49a..f1b24116ebc 100644 --- a/src/main/webapp/404static.xhtml +++ b/src/main/webapp/404static.xhtml @@ -72,7 +72,7 @@

    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