diff --git a/conf/solr/schema.xml b/conf/solr/schema.xml index 4d65b378485..905177d8c68 100644 --- a/conf/solr/schema.xml +++ b/conf/solr/schema.xml @@ -208,6 +208,7 @@ + diff --git a/doc/release-notes/11845-extend-search-api-return-islinked.md b/doc/release-notes/11845-extend-search-api-return-islinked.md new file mode 100644 index 00000000000..32bb7a7432b --- /dev/null +++ b/doc/release-notes/11845-extend-search-api-return-islinked.md @@ -0,0 +1,2 @@ +## Feature Request ## +Search API now returns "isLinked" in the JSON response for datasets and collections that are linked. "isLinked" will also be returned in direct dataset and collection lookups. This attribute will only be included when the value is true. diff --git a/src/main/java/edu/harvard/iq/dataverse/Dataset.java b/src/main/java/edu/harvard/iq/dataverse/Dataset.java index 39dccdcd4ea..124ba1817f5 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Dataset.java +++ b/src/main/java/edu/harvard/iq/dataverse/Dataset.java @@ -8,38 +8,17 @@ import edu.harvard.iq.dataverse.makedatacount.DatasetExternalCitations; import edu.harvard.iq.dataverse.makedatacount.DatasetMetrics; import edu.harvard.iq.dataverse.settings.FeatureFlags; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.sql.Timestamp; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.HashSet; -import java.util.List; -import java.util.Objects; -import java.util.Set; -import jakarta.persistence.CascadeType; -import jakarta.persistence.ColumnResult; -import jakarta.persistence.Entity; -import jakarta.persistence.Index; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.NamedNativeQuery; -import jakarta.persistence.NamedQueries; -import jakarta.persistence.NamedQuery; -import jakarta.persistence.OneToMany; -import jakarta.persistence.OneToOne; -import jakarta.persistence.OrderBy; -import jakarta.persistence.SqlResultSetMapping; -import jakarta.persistence.Table; -import jakarta.persistence.Temporal; -import jakarta.persistence.TemporalType; - import edu.harvard.iq.dataverse.settings.JvmSettings; import edu.harvard.iq.dataverse.storageuse.StorageUse; import edu.harvard.iq.dataverse.util.StringUtil; import edu.harvard.iq.dataverse.util.SystemConfig; +import jakarta.persistence.*; + +import java.nio.file.Path; +import java.nio.file.Paths; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.util.*; /** * @@ -810,13 +789,17 @@ public HarvestingClient getHarvestedFrom() { public void setHarvestedFrom(HarvestingClient harvestingClientConfig) { this.harvestedFrom = harvestingClientConfig; } - + public boolean isHarvested() { return this.harvestedFrom != null; } + public boolean isLinked() { + return (datasetLinkingDataverses != null && datasetLinkingDataverses.size() > 0); + } + private String harvestIdentifier; - + public String getHarvestIdentifier() { return harvestIdentifier; } diff --git a/src/main/java/edu/harvard/iq/dataverse/Dataverse.java b/src/main/java/edu/harvard/iq/dataverse/Dataverse.java index 31919398530..29a429f0034 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Dataverse.java +++ b/src/main/java/edu/harvard/iq/dataverse/Dataverse.java @@ -1,44 +1,16 @@ package edu.harvard.iq.dataverse; -import edu.harvard.iq.dataverse.dataverse.featured.DataverseFeaturedItem; -import edu.harvard.iq.dataverse.harvest.client.HarvestingClient; import edu.harvard.iq.dataverse.authorization.DataverseRole; import edu.harvard.iq.dataverse.dataset.DatasetType; +import edu.harvard.iq.dataverse.harvest.client.HarvestingClient; import edu.harvard.iq.dataverse.search.savedsearch.SavedSearch; import edu.harvard.iq.dataverse.storageuse.StorageUse; import edu.harvard.iq.dataverse.util.BundleUtil; import edu.harvard.iq.dataverse.util.SystemConfig; +import jakarta.persistence.*; +import jakarta.validation.constraints.*; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Objects; -import java.util.Set; -import jakarta.persistence.CascadeType; -import jakarta.persistence.CollectionTable; -import jakarta.persistence.Column; -import jakarta.persistence.ElementCollection; -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.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Pattern; -import jakarta.validation.constraints.Size; +import java.util.*; /** * @@ -327,7 +299,11 @@ public List getDatasetLinkingDataverses() { public void setDatasetLinkingDataverses(List datasetLinkingDataverses) { this.datasetLinkingDataverses = datasetLinkingDataverses; } - + + public boolean isLinked() { + return (dataverseLinkingDataverses != null && dataverseLinkingDataverses.size() > 0); + } + public Set getDataverseSubjects() { return dataverseSubjects; } 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 b32b5ae8d49..42dec683fe0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java @@ -418,19 +418,19 @@ protected Template findTemplateInDataverseOrParentsOrDie(Long templateId, Datave return template; } - protected DataverseLinkingDataverse findDataverseLinkingDataverseOrDie(String dataverseId, String linkedDataverseId) throws WrappedResponse { + protected DataverseLinkingDataverse findDataverseLinkingDataverseOrDie(String linkingDataverseId, String linkedDataverseId) throws WrappedResponse { DataverseLinkingDataverse dvld; - Dataverse dataverse = findDataverseOrDie(dataverseId); + Dataverse linkingDataverse = findDataverseOrDie(linkingDataverseId); Dataverse linkedDataverse = findDataverseOrDie(linkedDataverseId); try { - dvld = dvLinkingService.findDataverseLinkingDataverse(dataverse.getId(), linkedDataverse.getId()); + dvld = dvLinkingService.findDataverseLinkingDataverse(linkingDataverse.getId(), linkedDataverse.getId()); if (dvld == null) { - throw new WrappedResponse(notFound(BundleUtil.getStringFromBundle("find.dataverselinking.error.not.found.ids", Arrays.asList(dataverseId, linkedDataverseId)))); + throw new WrappedResponse(notFound(BundleUtil.getStringFromBundle("find.dataverselinking.error.not.found.ids", Arrays.asList(linkingDataverseId, linkedDataverseId)))); } return dvld; } catch (NumberFormatException nfe) { throw new WrappedResponse( - badRequest(BundleUtil.getStringFromBundle("find.dataverselinking.error.not.found.bad.ids", Arrays.asList(dataverseId, linkedDataverseId)))); + badRequest(BundleUtil.getStringFromBundle("find.dataverselinking.error.not.found.bad.ids", Arrays.asList(linkingDataverseId, linkedDataverseId)))); } } 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 8e4a83f48b9..76ba5f1e17d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java @@ -960,7 +960,7 @@ public Response deleteDataverseLinkingDataverse(@Context ContainerRequestContext @PathParam("linkedDataverseId") String linkedDataverseId) { boolean index = true; return response(req -> { - execCommand(new DeleteDataverseLinkingDataverseCommand(req, findDataverseOrDie(linkingDataverseId), findDataverseLinkingDataverseOrDie(linkingDataverseId, linkedDataverseId), index)); + execCommand(new DeleteDataverseLinkingDataverseCommand(req, findDataverseOrDie(linkedDataverseId), findDataverseLinkingDataverseOrDie(linkingDataverseId, linkedDataverseId), index)); return ok("Link from Dataverse " + linkingDataverseId + " to linked Dataverse " + linkedDataverseId + " deleted"); }, getRequestUser(crc)); } diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/DeleteDataverseLinkingDataverseCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/DeleteDataverseLinkingDataverseCommand.java index 33f88d8d768..f9317540042 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/DeleteDataverseLinkingDataverseCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/DeleteDataverseLinkingDataverseCommand.java @@ -8,17 +8,14 @@ import edu.harvard.iq.dataverse.Dataverse; import edu.harvard.iq.dataverse.DataverseLinkingDataverse; import edu.harvard.iq.dataverse.authorization.Permission; -import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.batch.util.LoggingUtil; import edu.harvard.iq.dataverse.engine.command.AbstractCommand; import edu.harvard.iq.dataverse.engine.command.CommandContext; import edu.harvard.iq.dataverse.engine.command.DataverseRequest; 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.PermissionException; import java.io.IOException; -import java.util.Collections; -import java.util.concurrent.Future; + import org.apache.solr.client.solrj.SolrServerException; /** @@ -30,40 +27,30 @@ public class DeleteDataverseLinkingDataverseCommand extends AbstractCommand { private final DataverseLinkingDataverse doomed; - private final Dataverse editedDv; + private final Dataverse linkedDataverse; private final boolean index; - public DeleteDataverseLinkingDataverseCommand(DataverseRequest aRequest, Dataverse editedDv , DataverseLinkingDataverse doomed, boolean index) { - super(aRequest, editedDv); - this.editedDv = editedDv; + public DeleteDataverseLinkingDataverseCommand(DataverseRequest aRequest, Dataverse linkedDataverse , DataverseLinkingDataverse doomed, boolean index) { + super(aRequest, linkedDataverse); + this.linkedDataverse = linkedDataverse; this.doomed = doomed; this.index = index; } @Override public Dataverse execute(CommandContext ctxt) throws CommandException { - Dataverse merged = ctxt.em().merge(editedDv); - DataverseLinkingDataverse doomedAndMerged = ctxt.em().merge(doomed); - ctxt.em().remove(doomedAndMerged); - - if (index) { - //can only index merged in the onSuccess method so must index doomed linking dataverse here - try { - ctxt.index().indexDataverse(doomed.getLinkingDataverse()); - } catch (IOException | SolrServerException e) { - String failureLogText = "Indexing failed for Linked Dataverse. You can kickoff a re-index of this datavese with: \r\n curl http://localhost:8080/api/admin/index/datasets/" + doomed.getLinkingDataverse().getId().toString(); - failureLogText += "\r\n" + e.getLocalizedMessage(); - LoggingUtil.writeOnSuccessFailureLog(this, failureLogText, doomed.getLinkingDataverse()); - } - } - return merged; + ctxt.em().remove(doomed); + return linkedDataverse; } @Override public boolean onSuccess(CommandContext ctxt, Object r) { try { - Future retVal = ctxt.index().indexDataverse((Dataverse) r); + if (index) { + ctxt.index().indexDataverse(doomed.getDataverse()); + ctxt.index().indexDataverse(doomed.getLinkingDataverse()); + } } catch (IOException | SolrServerException e) { Dataverse dv = (Dataverse) r; String failureLogText = "Indexing failed for Dataverse delinking. You can kickoff a re-index of this datavese with: \r\n curl http://localhost:8080/api/admin/index/datasets/" + dv.getId().toString(); 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 8132c5e113d..443a8ac83f8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/IndexServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/IndexServiceBean.java @@ -1,37 +1,8 @@ package edu.harvard.iq.dataverse.search; -import edu.harvard.iq.dataverse.ControlledVocabularyValue; -import edu.harvard.iq.dataverse.CurationStatus; -import edu.harvard.iq.dataverse.DataFile; -import edu.harvard.iq.dataverse.DataFileServiceBean; -import edu.harvard.iq.dataverse.DataFileTag; -import edu.harvard.iq.dataverse.DataTable; -import edu.harvard.iq.dataverse.Dataset; -import edu.harvard.iq.dataverse.DatasetField; -import edu.harvard.iq.dataverse.DatasetFieldCompoundValue; -import edu.harvard.iq.dataverse.DatasetFieldConstant; -import edu.harvard.iq.dataverse.DatasetFieldServiceBean; -import edu.harvard.iq.dataverse.DatasetFieldType; -import edu.harvard.iq.dataverse.DatasetFieldValue; -import edu.harvard.iq.dataverse.DatasetFieldValueValidator; -import edu.harvard.iq.dataverse.DatasetLinkingServiceBean; -import edu.harvard.iq.dataverse.DatasetServiceBean; -import edu.harvard.iq.dataverse.DatasetVersion; +import edu.harvard.iq.dataverse.*; import edu.harvard.iq.dataverse.DatasetVersion.VersionState; -import edu.harvard.iq.dataverse.DatasetVersionFilesServiceBean; -import edu.harvard.iq.dataverse.DatasetVersionServiceBean; -import edu.harvard.iq.dataverse.Dataverse; -import edu.harvard.iq.dataverse.DataverseLinkingServiceBean; -import edu.harvard.iq.dataverse.DataverseServiceBean; -import edu.harvard.iq.dataverse.DvObject; import edu.harvard.iq.dataverse.DvObject.DType; -import edu.harvard.iq.dataverse.DvObjectServiceBean; -import edu.harvard.iq.dataverse.Embargo; -import edu.harvard.iq.dataverse.FileMetadata; -import edu.harvard.iq.dataverse.GlobalId; -import edu.harvard.iq.dataverse.PermissionServiceBean; -import edu.harvard.iq.dataverse.Retention; -import edu.harvard.iq.dataverse.TermsOfUseAndAccess; import edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean; import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinUserServiceBean; import edu.harvard.iq.dataverse.batch.util.LoggingUtil; @@ -50,51 +21,12 @@ import edu.harvard.iq.dataverse.util.FileUtil; import edu.harvard.iq.dataverse.util.StringUtil; import edu.harvard.iq.dataverse.util.SystemConfig; -import java.io.IOException; -import java.io.InputStream; -import java.sql.Timestamp; -import java.text.SimpleDateFormat; -import java.time.LocalDate; -import java.time.ZoneOffset; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Collection; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.Future; -import java.util.concurrent.Semaphore; -import java.util.concurrent.atomic.AtomicReference; -import java.util.function.Function; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.regex.Pattern; -import java.util.stream.Collectors; -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.ejb.*; import jakarta.inject.Inject; import jakarta.inject.Named; import jakarta.json.JsonObject; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; -import jakarta.persistence.Query; - import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.util.Strings; @@ -107,8 +39,8 @@ import org.apache.solr.common.SolrDocumentList; import org.apache.solr.common.SolrInputDocument; import org.apache.solr.common.params.CursorMarkParams; -import org.apache.tika.parser.AutoDetectParser; import org.apache.tika.metadata.Metadata; +import org.apache.tika.parser.AutoDetectParser; import org.apache.tika.parser.ParseContext; import org.apache.tika.sax.BodyContentHandler; import org.eclipse.microprofile.metrics.MetricUnits; @@ -116,6 +48,27 @@ import org.eclipse.microprofile.metrics.annotation.Metric; import org.xml.sax.ContentHandler; +import java.io.IOException; +import java.io.InputStream; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Future; +import java.util.concurrent.Semaphore; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Function; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import static jakarta.ejb.TransactionAttributeType.REQUIRES_NEW; + @Stateless @Named public class IndexServiceBean { @@ -248,6 +201,9 @@ public Future indexDataverse(Dataverse dataverse, boolean processPaths) solrInputDocument.addField(SearchFields.METADATA_SOURCE, rootDataverse.getName()); //rootDataverseName); /*}*/ + solrInputDocument.addField(SearchFields.IS_LINKED, dataverse.isLinked()); + + addDataverseReleaseDateToSolrDoc(solrInputDocument, dataverse); // if (dataverse.getOwner() != null) { // solrInputDocument.addField(SearchFields.HOST_DATAVERSE, @@ -1063,6 +1019,8 @@ public SolrInputDocuments toSolrDocs(IndexableDataset indexableDataset, Set collections; + private Boolean isLinked; + // private boolean statePublished; /** * @todo Investigate/remove this "unpublishedState" variable. For files that @@ -583,9 +584,10 @@ public JsonObjectBuilder json(boolean showRelevance, boolean showEntityIds, bool .add("restricted", this.fileRestricted) .add("variables", this.tabularDataCount) .add("observations", this.observations) - .add("canDownloadFile", this.canDownloadFile); + .add("canDownloadFile", this.canDownloadFile) + .add("isLinked", this.isLinked); - // Now that nullSafeJsonBuilder has been instatiated, check for null before adding to it! + // Now that nullSafeJsonBuilder has been instantiated, check for null before adding to it! if (showRelevance) { nullSafeJsonBuilder.add("matches", getRelevance()); nullSafeJsonBuilder.add("score", getScore()); @@ -1136,6 +1138,15 @@ public Boolean getFileRestricted() { public void setFileRestricted(Boolean fileRestricted) { this.fileRestricted = fileRestricted; } + + public Boolean isLinked() { + return isLinked; + } + + public void setLinked(Boolean isLinked) { + this.isLinked = isLinked; + } + public Boolean getCanDownloadFile() { return canDownloadFile; } diff --git a/src/main/java/edu/harvard/iq/dataverse/search/SolrSearchServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/search/SolrSearchServiceBean.java index 401bd58a70b..a25375073c4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/SolrSearchServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/SolrSearchServiceBean.java @@ -12,34 +12,13 @@ import edu.harvard.iq.dataverse.settings.FeatureFlags; import edu.harvard.iq.dataverse.util.BundleUtil; import edu.harvard.iq.dataverse.util.SystemConfig; -import java.io.IOException; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Collections; -import java.util.Date; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.ListIterator; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.MissingResourceException; -import java.util.logging.Level; -import java.util.logging.Logger; import jakarta.ejb.EJB; import jakarta.ejb.EJBTransactionRolledbackException; import jakarta.ejb.Stateless; import jakarta.ejb.TransactionRolledbackLocalException; import jakarta.inject.Inject; import jakarta.inject.Named; -import jakarta.json.Json; -import jakarta.json.JsonArrayBuilder; import jakarta.persistence.NoResultException; - import org.apache.commons.lang3.StringUtils; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrQuery.SortClause; @@ -52,6 +31,12 @@ import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.*; +import java.util.logging.Level; +import java.util.logging.Logger; + @Stateless @Named public class SolrSearchServiceBean implements SearchService { @@ -544,6 +529,9 @@ public SolrQueryResponse search( if (Boolean.TRUE.equals((Boolean) solrDocument.getFieldValue(SearchFields.IS_HARVESTED))) { solrSearchResult.setHarvested(true); } + if (Boolean.TRUE.equals(solrDocument.getFieldValue(SearchFields.IS_LINKED))) { + solrSearchResult.setLinked(true); + } solrSearchResult.setEmbargoEndDate(embargoEndDate); solrSearchResult.setRetentionEndDate(retentionEndDate); 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 570e3939ab2..96f5963fb4b 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 @@ -279,7 +279,7 @@ public void removeLinks(DataverseRequest dvReq, SavedSearch savedSearch) throws Dataverse linkedDataverse = (Dataverse) dvObjectThatDefinitionPointWillLinkTo; DataverseLinkingDataverse dvld = dvLinkingService.findDataverseLinkingDataverse(linkingDataverse.getId(), linkedDataverse.getId()); if(dvld != null) { - Dataverse dv = commandEngine.submitInNewTransaction(new DeleteDataverseLinkingDataverseCommand(dvReq, linkingDataverse, dvld, true)); + Dataverse dv = commandEngine.submitInNewTransaction(new DeleteDataverseLinkingDataverseCommand(dvReq, linkedDataverse, dvld, true)); } } else if (dvObjectThatDefinitionPointWillLinkTo.isInstanceofDataset()) { Dataset linkedDataset = (Dataset) dvObjectThatDefinitionPointWillLinkTo; 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 d1cc26eec17..465d280cee8 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java @@ -5,8 +5,6 @@ import io.restassured.path.json.JsonPath; import io.restassured.response.Response; -import java.util.logging.Logger; - import static jakarta.ws.rs.core.Response.Status.*; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.jupiter.api.Assertions.*; @@ -18,8 +16,6 @@ public class LinkIT { - private static final Logger logger = Logger.getLogger(LinkIT.class.getCanonicalName()); - @BeforeAll public static void setUpClass() { RestAssured.baseURI = UtilIT.getRestAssuredBaseUri(); @@ -84,6 +80,13 @@ public void testLinkedDataset() { assertEquals("Darwin's Finches", JsonPath.from(getLinksResponse.asString()).getString("data.linkedDatasets[0].title")); assertEquals(datasetPid, JsonPath.from(getLinksResponse.asString()).getString("data.linkedDatasets[0].identifier")); + // Test that search shows the "isLinked" attribute in the result + Response searchResponse = UtilIT.search("id:dataset_" + datasetId + "_draft", superuserApiToken); + searchResponse.prettyPrint(); + searchResponse.then().assertThat() + .statusCode(OK.getStatusCode()) + .body("data.items[0].isLinked", equalTo(true)); + // A dataset cannot be linked to its parent dataverse. Response tryToLinkToParentDataverse = UtilIT.linkDataset(datasetPid, dataverse1Alias, superuserApiToken); tryToLinkToParentDataverse.prettyPrint(); @@ -172,11 +175,25 @@ public void testCreateDeleteDataverseLink() { // Undo superuser status to test that it's not required for deleting a link UtilIT.setSuperuserStatus(username1, false); + // Test that search shows the "isLinked" attribute in the result + Response searchResponse = UtilIT.search("dvAlias:" + dataverse1Alias, apiToken1); + searchResponse.prettyPrint(); + searchResponse.then().assertThat() + .statusCode(OK.getStatusCode()) + .body("data.items[0].isLinked", equalTo(true)); + Response deleteLinkingDataverseResponse = UtilIT.deleteDataverseLink(dataverse1Alias, dataverse2Alias, apiToken1); deleteLinkingDataverseResponse.prettyPrint(); deleteLinkingDataverseResponse.then().assertThat() .statusCode(OK.getStatusCode()) .body("data.message", equalTo("Link from Dataverse " + dataverse2Alias + " to linked Dataverse " + dataverse1Alias + " deleted")); + + // Test that search no longer shows the "isLinked" attribute in the result + searchResponse = UtilIT.search("dvAlias:" + dataverse1Alias, apiToken1); + searchResponse.prettyPrint(); + searchResponse.then().assertThat() + .statusCode(OK.getStatusCode()) + .body("data.items[0].isLinked", equalTo(null)); } @Test