Skip to content
Open
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 doc/release-notes/12659-split-TermsOfUseAndAccess.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
To prepare for file-specific licenses/terms the tables `TermsOfUseAndAccess` is split into two separate tables: `TermsOfUseOrLicense` and `TermsOfAccess`. Existing functionality is preserved.
2 changes: 1 addition & 1 deletion doc/sphinx-guides/source/installation/config.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2157,7 +2157,7 @@ Example::
license.cc0_1.0.description=Creative Commons CC0 1.0 Universal Public Domain Dedication.
license.cc0_1.0.name=CC0 1.0

You have a lot of control over which licenses and terms are available. You can remove licenses and add new ones. You can decide which license is the default. You can remove "Custom Dataset Terms" as a option. You can remove all licenses and make "Custom Dataset Terms" the only option.
You have a lot of control over which licenses and terms are available. You can remove licenses and add new ones. You can decide which license is the default. You can remove "Custom Dataset Terms" as an option. You can remove all licenses and make "Custom Dataset Terms" the only option.

Before making changes, you are encouraged to read the :ref:`license-terms` section of the User Guide about why CC0 is the default and what the "Custom Dataset Terms" option allows.

Expand Down
22 changes: 16 additions & 6 deletions src/main/java/edu/harvard/iq/dataverse/Dataset.java
Original file line number Diff line number Diff line change
Expand Up @@ -398,16 +398,26 @@ private DatasetVersion createNewDatasetVersion(Template template, FileMetadata f
}
}

if (latestVersion.getTermsOfUseAndAccess()!= null){
TermsOfUseAndAccess terms = latestVersion.getTermsOfUseAndAccess().copyTermsOfUseAndAccess();
if (latestVersion.getTermsOfAccess() != null){
TermsOfAccess terms = latestVersion.getTermsOfAccess().copyTermsOfAccess();
terms.setDatasetVersion(dsv);
dsv.setTermsOfUseAndAccess(terms);
dsv.setTermsOfAccess(terms);
} else {
TermsOfUseAndAccess terms = new TermsOfUseAndAccess();
TermsOfAccess terms = new TermsOfAccess();
terms.setDatasetVersion(dsv);
terms.setLicense(null);
terms.setFileAccessRequest(true);
dsv.setTermsOfUseAndAccess(terms);
dsv.setTermsOfAccess(terms);
}

if (latestVersion.getTermsOfUseOrLicense() != null){
TermsOfUseOrLicense terms = latestVersion.getTermsOfUseOrLicense().copyTermsOfUseOrLicense();
terms.setDatasetVersion(dsv);
dsv.setTermsOfUseOrLicense(terms);
} else {
TermsOfUseOrLicense terms = new TermsOfUseOrLicense();
terms.setDatasetVersion(dsv);
terms.setLicense(null);
dsv.setTermsOfUseOrLicense(terms);
}
}

Expand Down
37 changes: 19 additions & 18 deletions src/main/java/edu/harvard/iq/dataverse/DatasetPage.java
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
import edu.harvard.iq.dataverse.util.JsfHelper;
import static edu.harvard.iq.dataverse.util.JsfHelper.JH;
import static edu.harvard.iq.dataverse.util.StringUtil.isEmpty;
import static java.lang.Integer.*;

import edu.harvard.iq.dataverse.util.StringUtil;
import edu.harvard.iq.dataverse.util.SystemConfig;
Expand Down Expand Up @@ -474,7 +475,7 @@ public Boolean isHasValidTermsOfAccess() {
hasValidTermsOfAccess = true;
return hasValidTermsOfAccess;
} else {
hasValidTermsOfAccess = TermsOfUseAndAccessValidator.isTOUAValid(dataset.getLatestVersion().getTermsOfUseAndAccess(), null);
hasValidTermsOfAccess = TermsOfAccessValidator.isTOUAValid(dataset.getLatestVersion().getTermsOfAccess(), null);
return hasValidTermsOfAccess;
}
}
Expand Down Expand Up @@ -1039,7 +1040,7 @@ public Set<Long> getFileIdsInVersionFromSolr(Long datasetVersionId, String patte

// Unlimited number of search results:
// (but we are searching within one dataset(version), so it should be manageable)
solrQuery.setRows(Integer.MAX_VALUE);
solrQuery.setRows(MAX_VALUE);

logger.fine("Solr query (file search): " + solrQuery);

Expand Down Expand Up @@ -1940,9 +1941,9 @@ public void handleChangeButton() {
/*
Issue 8646: necessary for the access popup which is shared by the dataset page and the file page
*/
setFileAccessRequest(workingVersion.getTermsOfUseAndAccess().isFileAccessRequest());
setTermsOfAccess(workingVersion.getTermsOfUseAndAccess().getTermsOfAccess());
setFileAccessRequest(workingVersion.getTermsOfAccess().isFileAccessRequest());
setTermsOfAccess(workingVersion.getTermsOfAccess().getTermsOfAccess());

resetVersionUI();
}

Expand Down Expand Up @@ -2275,8 +2276,8 @@ private String init(boolean initFull) {
JH.addMessage(FacesMessage.SEVERITY_WARN, BundleUtil.getStringFromBundle("dataset.message.label.fileAccess"),
BundleUtil.getStringFromBundle("dataset.message.publicInstall"));
}
setFileAccessRequest(workingVersion.getTermsOfUseAndAccess().isFileAccessRequest());
setTermsOfAccess(workingVersion.getTermsOfUseAndAccess().getTermsOfAccess());
setFileAccessRequest(workingVersion.getTermsOfAccess().isFileAccessRequest());
setTermsOfAccess(workingVersion.getTermsOfAccess().getTermsOfAccess());
resetVersionUI();

// FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Add New Dataset", " - Enter metadata to create the dataset's citation. You can add more metadata about this dataset after it's created."));
Expand Down Expand Up @@ -2704,11 +2705,11 @@ private void refreshSelectedFiles(List<FileMetadata> filesToRefresh){
if (readOnly) {
dataset = datasetService.find(dataset.getId());
}
String termsOfAccess = workingVersion.getTermsOfUseAndAccess().getTermsOfAccess();
boolean requestAccess = workingVersion.getTermsOfUseAndAccess().isFileAccessRequest();
String termsOfAccess = workingVersion.getTermsOfAccess().getTermsOfAccess();
boolean requestAccess = workingVersion.getTermsOfAccess().isFileAccessRequest();
workingVersion = dataset.getOrCreateEditVersion();
workingVersion.getTermsOfUseAndAccess().setTermsOfAccess(termsOfAccess);
workingVersion.getTermsOfUseAndAccess().setFileAccessRequest(requestAccess);
workingVersion.getTermsOfAccess().setTermsOfAccess(termsOfAccess);
workingVersion.getTermsOfAccess().setFileAccessRequest(requestAccess);
List <FileMetadata> newSelectedFiles = new ArrayList<>();
for (FileMetadata fmd : filesToRefresh){
for (FileMetadata fmdn: workingVersion.getFileMetadatas()){
Expand Down Expand Up @@ -2778,7 +2779,7 @@ public void edit(EditMode editMode) {
//FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Edit Dataset Metadata", " - Add more metadata about your dataset to help others easily find it."));
} else if (editMode.equals(EditMode.LICENSE)){
if(!isHasValidTermsOfAccess()){
workingVersion.getTermsOfUseAndAccess().setFileAccessRequest(true);
workingVersion.getTermsOfAccess().setFileAccessRequest(true);
}
JH.addMessage(FacesMessage.SEVERITY_INFO, BundleUtil.getStringFromBundle("dataset.message.editTerms.label"), BundleUtil.getStringFromBundle("dataset.message.editTerms.message"));
//FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Edit Dataset License and Terms", " - Update your dataset's license and terms of use."));
Expand Down Expand Up @@ -3793,8 +3794,8 @@ private void restrictFiles(List<FileMetadata> filesToRestrict, boolean restricte
}

if (restricted) { // get values from access popup
workingVersion.getTermsOfUseAndAccess().setTermsOfAccess(termsOfAccess);
workingVersion.getTermsOfUseAndAccess().setFileAccessRequest(fileAccessRequest);
workingVersion.getTermsOfAccess().setTermsOfAccess(termsOfAccess);
workingVersion.getTermsOfAccess().setFileAccessRequest(fileAccessRequest);
}


Expand Down Expand Up @@ -3975,16 +3976,16 @@ public void setEnteredFileAccessRequest(Boolean fileAccessRequest) {


public String saveWithTermsOfUse() {
workingVersion.getTermsOfUseAndAccess().setTermsOfAccess(enteredTermsOfAccess);
workingVersion.getTermsOfUseAndAccess().setFileAccessRequest(enteredFileAccessRequest);
workingVersion.getTermsOfAccess().setTermsOfAccess(enteredTermsOfAccess);
workingVersion.getTermsOfAccess().setFileAccessRequest(enteredFileAccessRequest);
return save();
}

public void validateDeaccessionReason(FacesContext context, UIComponent toValidate, Object value) {

UIInput reasonRadio = (UIInput) toValidate.getAttributes().get("reasonRadio");
Object reasonRadioValue = reasonRadio.getValue();
Integer radioVal = new Integer(reasonRadioValue.toString());
Integer radioVal = parseInt(reasonRadioValue.toString());

if (radioVal == 7 && (value == null || value.toString().isEmpty())) {
((UIInput) toValidate).setValid(false);
Expand Down Expand Up @@ -5534,7 +5535,7 @@ public boolean isFileAccessRequestMultiButtonRequired(){
if (workingVersion == null) {
return false;
}
if (!workingVersion.getTermsOfUseAndAccess().isFileAccessRequest()){
if (!workingVersion.getTermsOfAccess().isFileAccessRequest()){
// return false;
}
for (FileMetadata fmd : workingVersion.getFileMetadatas()){
Expand Down
113 changes: 77 additions & 36 deletions src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,13 @@
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.function.Function;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;

import static java.util.stream.Collectors.joining;

/**
*
* @author skraffmiller
Expand Down Expand Up @@ -137,14 +140,18 @@

@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 143 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;
@JoinColumn(name = "termsofaccess_id")
private TermsOfAccess termsOfAccess;

@OneToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval=true)
@JoinColumn(name = "default_termsofuseorlicense_id")
private TermsOfUseOrLicense termsOfUseOrLicense;

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

Check warning on line 154 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 @@ -305,12 +312,20 @@
this.fileMetadatas = fileMetadatas;
}

public TermsOfUseAndAccess getTermsOfUseAndAccess() {
return termsOfUseAndAccess;
public TermsOfAccess getTermsOfAccess() {
return termsOfAccess;
}

public void setTermsOfAccess(TermsOfAccess termsOfAccess) {
this.termsOfAccess = termsOfAccess;
}

public TermsOfUseOrLicense getTermsOfUseOrLicense() {
return termsOfUseOrLicense;
}

public void setTermsOfUseAndAccess(TermsOfUseAndAccess termsOfUseAndAccess) {
this.termsOfUseAndAccess = termsOfUseAndAccess;
public void setTermsOfUseOrLicense(TermsOfUseOrLicense termsOfUseOrLicense) {
this.termsOfUseOrLicense = termsOfUseOrLicense;
}

public List<DatasetField> getDatasetFields() {
Expand Down Expand Up @@ -661,10 +676,15 @@
if (!template.getDatasetFields().isEmpty()) {
this.setDatasetFields(this.copyDatasetFields(template.getDatasetFields()));
}
if (template.getTermsOfUseAndAccess() != null) {
TermsOfUseAndAccess terms = template.getTermsOfUseAndAccess().copyTermsOfUseAndAccess();
if (template.getTermsOfAccess() != null) {
TermsOfAccess terms = template.getTermsOfAccess().copyTermsOfAccess();
terms.setDatasetVersion(this);
this.setTermsOfAccess(terms);
}
if (template.getTermsOfUseOrLicense() != null) {
TermsOfUseOrLicense terms = template.getTermsOfUseOrLicense().copyTermsOfUseOrLicense();
terms.setDatasetVersion(this);
this.setTermsOfUseAndAccess(terms);
this.setTermsOfUseOrLicense(terms);
}
}

Expand All @@ -691,15 +711,25 @@
fm.createCopyInVersion(dsv);
}

if (this.getTermsOfUseAndAccess()!= null){
TermsOfUseAndAccess terms = this.getTermsOfUseAndAccess().copyTermsOfUseAndAccess();
if (this.getTermsOfAccess() != null){
TermsOfAccess terms = this.getTermsOfAccess().copyTermsOfAccess();
terms.setDatasetVersion(dsv);
dsv.setTermsOfAccess(terms);
} else {
TermsOfAccess terms = new TermsOfAccess();
terms.setDatasetVersion(dsv);
dsv.setTermsOfAccess(terms);
}

if (this.getTermsOfUseOrLicense() != null){
TermsOfUseOrLicense terms = this.getTermsOfUseOrLicense().copyTermsOfUseOrLicense();
terms.setDatasetVersion(dsv);
dsv.setTermsOfUseAndAccess(terms);
dsv.setTermsOfUseOrLicense(terms);
} else {
TermsOfUseAndAccess terms = new TermsOfUseAndAccess();
TermsOfUseOrLicense terms = new TermsOfUseOrLicense();
terms.setDatasetVersion(dsv);
// terms.setLicense(TermsOfUseAndAccess.License.CC0);
dsv.setTermsOfUseAndAccess(terms);
// terms.setLicense(License.CC0);
dsv.setTermsOfUseOrLicense(terms);
}

dsv.setDataset(this.getDataset());
Expand All @@ -711,11 +741,14 @@
// from template or user entry
this.setDatasetFields(new ArrayList<>());
this.setDatasetFields(this.initDatasetFields());
TermsOfUseAndAccess terms = new TermsOfUseAndAccess();
terms.setDatasetVersion(this);
terms.setLicense(license);
terms.setFileAccessRequest(true);
this.setTermsOfUseAndAccess(terms);
TermsOfAccess termsOfAccess = new TermsOfAccess();
TermsOfUseOrLicense termsOfUseOrLicense = new TermsOfUseOrLicense();
termsOfAccess.setDatasetVersion(this);
termsOfUseOrLicense.setDatasetVersion(this);
termsOfUseOrLicense.setLicense(license);
termsOfAccess.setFileAccessRequest(true);
this.setTermsOfAccess(termsOfAccess);
this.setTermsOfUseOrLicense(termsOfUseOrLicense);

}

Expand Down Expand Up @@ -1808,25 +1841,34 @@
}
}
}


TermsOfUseAndAccess toua = this.termsOfUseAndAccess;
//Only need to test Terms of Use and Access if there are restricted files
if (toua != null && this.isHasRestrictedFile()) {
Set<ConstraintViolation<TermsOfUseAndAccess>> constraintViolations = validator.validate(toua);
if (constraintViolations.size() > 0) {
ConstraintViolation<TermsOfUseAndAccess> violation = constraintViolations.iterator().next();
String message = BundleUtil.getStringFromBundle("dataset.message.toua.invalid");
logger.info(message);
this.termsOfUseAndAccess.setValidationMessage(message);
returnSet.add(violation);

if (this.termsOfAccess != null) {
var violations = validator.validate(this.termsOfAccess);
if (violations.size() > 0) {
returnSet.add(getViolation(violations, this.termsOfAccess.getValidationMessage()));
}
}
if (this.termsOfUseOrLicense != null) {
var violations = validator.validate(this.termsOfUseOrLicense);
if (violations.size() > 0) {
returnSet.add(getViolation(violations, this.termsOfUseOrLicense.getValidationMessage()));
}
}


return returnSet;
}


private <T> ConstraintViolation<T> getViolation(Set<ConstraintViolation<T>> violations, String msg) {
String validationMessage = violations.stream()
.map(cv -> cv.getMessage() + " (Invalid value:" + cv.getInvalidValue() + ")")
.collect(joining(", ", "Validation Failed: ", "."));
logger.info(validationMessage);
return violations.stream()
.filter(v -> Objects.equals(v.getMessage(), msg))
.findFirst()
.orElseGet(() -> violations.iterator().next());
}

public List<WorkflowComment> getWorkflowComments() {
return workflowComments;
}
Expand Down Expand Up @@ -2046,8 +2088,7 @@
* We used to include "https://schema.org/version/3.3" in the output for
* "schemaVersion".
*/
TermsOfUseAndAccess terms = this.getTermsOfUseAndAccess();
if (terms != null) {
if (this.getTermsOfUseOrLicense() != null) {
job.add("license",DatasetUtil.getLicenseURI(this));
}

Expand Down
Loading
Loading