Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions conf/solr/schema.xml
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,7 @@
<field name="license" type="string" stored="true" indexed="true" multiValued="false"/>
<field name="fileCount" type="plong" stored="true" indexed="true" multiValued="false"/>
<field name="datasetCount" type="plong" stored="true" indexed="true" multiValued="false"/>
<field name="relatedDatasetCount" type="plong" stored="true" indexed="true" multiValued="false"/>

<!--
METADATA SCHEMA FIELDS
Expand Down
269 changes: 266 additions & 3 deletions doc/sphinx-guides/source/api/native-api.rst

Large diffs are not rendered by default.

10 changes: 10 additions & 0 deletions scripts/api/data/relationTypes/relationTypeAllFields.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"name": "IsSupplementTo",
"displayName": "Is supplement to",
"description": "Indicates that A is a supplement to B.",
"inverse": {
"name": "IsSupplementedBy",
"displayName": "Is supplemented by",
"description": "Indicates that B is a supplement to A."
}
}
1 change: 1 addition & 0 deletions scripts/api/data/role-curator.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"permissions":[
"ViewUnpublishedDataset",
"EditDataset",
"EditDatasetRelations",
"DownloadFile",
"DeleteDatasetDraft",
"PublishDataset",
Expand Down
1 change: 1 addition & 0 deletions scripts/api/data/role-editor.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"permissions":[
"ViewUnpublishedDataset",
"EditDataset",
"EditDatasetRelations",
"DownloadFile",
"DeleteDatasetDraft"
]
Expand Down
1 change: 1 addition & 0 deletions scripts/api/data/role-manager.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"permissions":[
"ViewUnpublishedDataset",
"EditDataset",
"EditDatasetRelations",
"DownloadFile",
"DeleteDatasetDraft"
]
Expand Down
11 changes: 10 additions & 1 deletion src/main/java/edu/harvard/iq/dataverse/Dataset.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import edu.harvard.iq.dataverse.dataset.DatasetThumbnail;
import edu.harvard.iq.dataverse.dataset.DatasetType;
import edu.harvard.iq.dataverse.dataset.DatasetUtil;
import edu.harvard.iq.dataverse.datasetrelation.DatasetRelation;
import edu.harvard.iq.dataverse.harvest.client.HarvestingClient;
import edu.harvard.iq.dataverse.license.License;
import edu.harvard.iq.dataverse.makedatacount.DatasetExternalCitations;
Expand Down Expand Up @@ -360,6 +361,7 @@ public void setVersions(List<DatasetVersion> versions) {
private DatasetVersion createNewDatasetVersion(Template template, FileMetadata fmVarMet) {

DatasetVersion dsv = new DatasetVersion();
dsv.setDataset(this);
dsv.setVersionState(DatasetVersion.VersionState.DRAFT);
dsv.setFileMetadatas(new ArrayList<>());
DatasetVersion latestVersion;
Expand Down Expand Up @@ -409,6 +411,14 @@ private DatasetVersion createNewDatasetVersion(Template template, FileMetadata f
terms.setFileAccessRequest(true);
dsv.setTermsOfUseAndAccess(terms);
}

if (latestVersion.getRelations() != null && !latestVersion.getRelations().isEmpty()) {
List<DatasetRelation> relations = new ArrayList<>();
for (DatasetRelation rel : latestVersion.getRelations()) {
relations.add(rel.copy(dsv));
}
dsv.setRelations(relations);
}
}

// I'm adding the version to the list so it will be persisted when
Expand All @@ -420,7 +430,6 @@ private DatasetVersion createNewDatasetVersion(Template template, FileMetadata f
getVersions().add(0, dsv);
}

dsv.setDataset(this);
return dsv;
}

Expand Down
25 changes: 23 additions & 2 deletions src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import edu.harvard.iq.dataverse.util.json.JsonUtil;
import edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder;
import edu.harvard.iq.dataverse.workflows.WorkflowComment;
import edu.harvard.iq.dataverse.datasetrelation.DatasetRelation;
import jakarta.json.*;
import jakarta.persistence.*;
import jakarta.validation.ConstraintViolation;
Expand Down Expand Up @@ -101,7 +102,7 @@
public static final String ARCHIVAL_STATUS_SUCCESS = "success";
public static final String ARCHIVAL_STATUS_FAILURE = "failure";
public static final String ARCHIVAL_STATUS_OBSOLETE = "obsolete";

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
Expand Down Expand Up @@ -137,14 +138,14 @@

@OneToMany(mappedBy = "datasetVersion", cascade = {CascadeType.REMOVE, CascadeType.MERGE, CascadeType.PERSIST})
@OrderBy("label, id") // this is not our preferred ordering, which is with the AlphaNumericComparator, but does allow the files to be grouped by category; adding id, to avoid ambiguity when there are duplicate filenames. (L.A., 05-2026)
private List<FileMetadata> fileMetadatas = new ArrayList();

Check warning on line 141 in src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java

View workflow job for this annotation

GitHub Actions / (Stable / JDK 21) Unit Tests

unchecked conversion

@OneToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval=true)
@JoinColumn(name = "termsOfUseAndAccess_id")
private TermsOfUseAndAccess termsOfUseAndAccess;

@OneToMany(mappedBy = "datasetVersion", orphanRemoval = true, cascade = {CascadeType.REMOVE, CascadeType.MERGE, CascadeType.PERSIST})
private List<DatasetField> datasetFields = new ArrayList();

Check warning on line 148 in src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java

View workflow job for this annotation

GitHub Actions / (Stable / JDK 21) Unit Tests

unchecked conversion

@Temporal(value = TemporalType.TIMESTAMP)
@Column( nullable=false )
Expand Down Expand Up @@ -201,12 +202,23 @@
private DatasetVersionDifference dvd;

//The Json version of the archivalCopyLocation string
@Transient
@Transient
private JsonObject archivalCopyLocationJson;

@Transient
private Boolean hasFiles = null;

@OneToMany(mappedBy = "definitionPoint", cascade = {CascadeType.REMOVE, CascadeType.MERGE, CascadeType.PERSIST}, orphanRemoval = true)
private List<DatasetRelation> relations;

public List<DatasetRelation> getRelations() {
return relations;
}

public void setRelations(List<DatasetRelation> relations) {
this.relations = relations;
}

public Long getId() {
return this.id;
}
Expand Down Expand Up @@ -703,6 +715,15 @@
}

dsv.setDataset(this.getDataset());

if (this.getRelations() != null && !this.getRelations().isEmpty()) {
List<DatasetRelation> clonedRelations = new ArrayList<>();
for (DatasetRelation r : this.getRelations()) {
clonedRelations.add(r.copy(dsv));
}
dsv.setRelations(clonedRelations);
}

return dsv;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
import edu.harvard.iq.dataverse.datavariable.DataVariable;
import edu.harvard.iq.dataverse.datavariable.VarGroup;
import edu.harvard.iq.dataverse.datavariable.VariableMetadataUtil;
import edu.harvard.iq.dataverse.datasetrelation.DatasetRelation;
import edu.harvard.iq.dataverse.util.StringUtil;
import edu.harvard.iq.dataverse.util.json.JsonPrinter;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
Expand Down Expand Up @@ -47,6 +49,8 @@ public final class DatasetVersionDifference {
private List<FileMetadata> changedVariableMetadata = new ArrayList<>();
private List<FileMetadata[]> replacedFiles = new ArrayList<>();
private List<String[]> changedTermsAccess = new ArrayList<>();
private List<DatasetRelation> addedRelations = new ArrayList<>();
private List<DatasetRelation> removedRelations = new ArrayList<>();
private List<SummaryNote> summaryDataForNote = new ArrayList<>();
private List<SummaryNote> blockDataForNote = new ArrayList<>();

Expand Down Expand Up @@ -179,6 +183,7 @@ public DatasetVersionDifference(DatasetVersion newVersion, DatasetVersion origin

logger.fine("Main difference loop execution time: " + (System.currentTimeMillis() - startTime) + " ms");
initDatasetFilesDifferencesList();
getRelationDifferences();

//Sort within blocks by datasetfieldtype display order
for (List<DatasetField[]> blockList : detailDataByBlock) {
Expand Down Expand Up @@ -210,6 +215,24 @@ public DatasetVersionDifference(DatasetVersion newVersion, DatasetVersion origin
});
getTermsDifferences();
}

private void getRelationDifferences() {
Map<String, DatasetRelation> originalRelations = new HashMap<>();
List<DatasetRelation> originalVersionRelations = originalVersion.getRelations() == null
? Collections.emptyList() : originalVersion.getRelations();
for (DatasetRelation relation : originalVersionRelations) {
originalRelations.put(relation.toVersionComparisonKey(), relation);
}

List<DatasetRelation> newVersionRelations = newVersion.getRelations() == null
? Collections.emptyList() : newVersion.getRelations();
for (DatasetRelation relation : newVersionRelations) {
if (originalRelations.remove(relation.toVersionComparisonKey()) == null) {
addedRelations.add(relation);
}
}
removedRelations.addAll(originalRelations.values());
}



Expand Down Expand Up @@ -1724,6 +1747,7 @@ public JsonObjectBuilder getSummaryDifferenceAsJson(){
}

jobVersion.add("files", getFileSummaryAsJson());
jobVersion.add("relations", getRelationsSummaryAsJson());

if (!this.changedTermsAccess.isEmpty()) {
jobVersion.add("termsAccessChanged", true);
Expand All @@ -1733,6 +1757,13 @@ public JsonObjectBuilder getSummaryDifferenceAsJson(){

return jobVersion;
}

private JsonObjectBuilder getRelationsSummaryAsJson() {
JsonObjectBuilder job = new NullSafeJsonBuilder();
job.add("added", addedRelations.size());
job.add("removed", removedRelations.size());
return job;
}

private JsonObjectBuilder getSummaryNoteAsJson(SummaryNote sn){
JsonObjectBuilder job = new NullSafeJsonBuilder();
Expand Down Expand Up @@ -1870,6 +1901,13 @@ public JsonObjectBuilder compareVersionsAsJson() {
job.add("fileChanges", jabDiffFiles);
}

if (!addedRelations.isEmpty()) {
job.add("relationsAdded", JsonPrinter.json(addedRelations, newVersion.getDataset(), false));
}
if (!removedRelations.isEmpty()) {
job.add("relationsRemoved", JsonPrinter.json(removedRelations, originalVersion.getDataset(), false));
}

// Format Terms Of Access changes
if (!changedTermsAccess.isEmpty()) {
JsonObjectBuilder jobTOA = new NullSafeJsonBuilder();
Expand Down
18 changes: 18 additions & 0 deletions src/main/java/edu/harvard/iq/dataverse/EjbDataverseEngine.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import edu.harvard.iq.dataverse.dataset.DatasetFieldsValidator;
import edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean;
import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinUserServiceBean;
import edu.harvard.iq.dataverse.datasetrelation.DatasetRelationServiceBean;
import edu.harvard.iq.dataverse.datasetrelation.DatasetRelationTypeServiceBean;
import edu.harvard.iq.dataverse.dataverse.featured.DataverseFeaturedItemServiceBean;
import edu.harvard.iq.dataverse.license.LicenseServiceBean;
import edu.harvard.iq.dataverse.util.cache.CacheFactoryBean;
Expand Down Expand Up @@ -140,6 +142,12 @@ public class EjbDataverseEngine {
@EJB
DatasetTypeServiceBean datasetTypeService;

@EJB
DatasetRelationServiceBean datasetRelationService;

@EJB
DatasetRelationTypeServiceBean datasetRelationTypeService;

@EJB
DataverseLinkingServiceBean dvLinking;

Expand Down Expand Up @@ -665,6 +673,16 @@ public DatasetTypeServiceBean datasetTypes() {
return datasetTypeService;
}

@Override
public DatasetRelationServiceBean datasetRelations() {
return datasetRelationService;
}

@Override
public DatasetRelationTypeServiceBean datasetRelationTypes() {
return datasetRelationTypeService;
}

@Override
public void beginCommandSequence() {
this.commandsCalled = new Stack();
Expand Down
Loading
Loading