diff --git a/doc/release-notes/12659-split-TermsOfUseAndAccess.md b/doc/release-notes/12659-split-TermsOfUseAndAccess.md new file mode 100644 index 00000000000..ea56202b463 --- /dev/null +++ b/doc/release-notes/12659-split-TermsOfUseAndAccess.md @@ -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. diff --git a/doc/sphinx-guides/source/installation/config.rst b/doc/sphinx-guides/source/installation/config.rst index 360a96e8eb5..02e520a9b81 100644 --- a/doc/sphinx-guides/source/installation/config.rst +++ b/doc/sphinx-guides/source/installation/config.rst @@ -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. diff --git a/src/main/java/edu/harvard/iq/dataverse/Dataset.java b/src/main/java/edu/harvard/iq/dataverse/Dataset.java index 39dccdcd4ea..24a56919125 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Dataset.java +++ b/src/main/java/edu/harvard/iq/dataverse/Dataset.java @@ -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); } } diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java index ff047bec4b0..48a6f31524b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java @@ -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; @@ -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; } } @@ -1039,7 +1040,7 @@ public Set 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); @@ -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(); } @@ -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.")); @@ -2704,11 +2705,11 @@ private void refreshSelectedFiles(List 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 newSelectedFiles = new ArrayList<>(); for (FileMetadata fmd : filesToRefresh){ for (FileMetadata fmdn: workingVersion.getFileMetadatas()){ @@ -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.")); @@ -3793,8 +3794,8 @@ private void restrictFiles(List 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); } @@ -3975,8 +3976,8 @@ 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(); } @@ -3984,7 +3985,7 @@ public void validateDeaccessionReason(FacesContext context, UIComponent toValida 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); @@ -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()){ diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java index 4bff7150b97..828e6827cd8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java @@ -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 @@ -140,9 +143,13 @@ public enum VersionState { private List fileMetadatas = new ArrayList(); @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 datasetFields = new ArrayList(); @@ -305,12 +312,20 @@ public void setFileMetadatas(List fileMetadatas) { 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 getDatasetFields() { @@ -661,10 +676,15 @@ public void updateDefaultValuesFromTemplate(Template template) { 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); } } @@ -691,15 +711,25 @@ public DatasetVersion cloneDatasetVersion(){ 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()); @@ -711,11 +741,14 @@ public void initDefaultValues(License license) { // 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); } @@ -1808,25 +1841,34 @@ public Set validate() { } } } - - - TermsOfUseAndAccess toua = this.termsOfUseAndAccess; - //Only need to test Terms of Use and Access if there are restricted files - if (toua != null && this.isHasRestrictedFile()) { - Set> constraintViolations = validator.validate(toua); - if (constraintViolations.size() > 0) { - ConstraintViolation 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 ConstraintViolation getViolation(Set> 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 getWorkflowComments() { return workflowComments; } @@ -2046,8 +2088,7 @@ public String getJsonLd() { * 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)); } diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionDifference.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersionDifference.java index fd52e0c4df4..369e1e96605 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionDifference.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersionDifference.java @@ -208,22 +208,52 @@ public DatasetVersionDifference(DatasetVersion newVersion, DatasetVersion origin int b = dsfb[0].getDatasetFieldType().getMetadataBlock().getId().intValue(); return Integer.valueOf(a).compareTo(b); }); - getTermsDifferences(); + getTermsOfAccessDifferences(); + getTermsOfUseOrLicenseDifferences(); } - private void getTermsDifferences() { + private void getTermsOfAccessDifferences() { - TermsOfUseAndAccess originalTerms = originalVersion.getTermsOfUseAndAccess(); + TermsOfAccess originalTerms = originalVersion.getTermsOfAccess(); if(originalTerms == null) { - originalTerms = new TermsOfUseAndAccess(); + originalTerms = new TermsOfAccess(); } // newTerms should never be null - TermsOfUseAndAccess newTerms = newVersion.getTermsOfUseAndAccess(); + TermsOfAccess newTerms = newVersion.getTermsOfAccess(); if(newTerms == null) { logger.warning("New version does not have TermsOfUseAndAccess"); - newTerms = new TermsOfUseAndAccess(); + newTerms = new TermsOfAccess(); + } + + checkAndAddToChangeList(originalTerms.getTermsOfAccess(), newTerms.getTermsOfAccess(), + BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfAccess.termsOfAccess")); + checkAndAddToChangeList(originalTerms.getDataAccessPlace(), newTerms.getDataAccessPlace(), + BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfAccess.addInfo.dataAccessPlace")); + checkAndAddToChangeList(originalTerms.getOriginalArchive(), newTerms.getOriginalArchive(), + BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfAccess.addInfo.originalArchive")); + checkAndAddToChangeList(originalTerms.getAvailabilityStatus(), newTerms.getAvailabilityStatus(), + BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfAccess.addInfo.availabilityStatus")); + checkAndAddToChangeList(originalTerms.getContactForAccess(), newTerms.getContactForAccess(), + BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfAccess.addInfo.contactForAccess")); + checkAndAddToChangeList(originalTerms.getSizeOfCollection(), newTerms.getSizeOfCollection(), + BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfAccess.addInfo.sizeOfCollection")); + checkAndAddToChangeList(originalTerms.getStudyCompletion(), newTerms.getStudyCompletion(), + BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfAccess.addInfo.studyCompletion")); + } + + private void getTermsOfUseOrLicenseDifferences() { + + TermsOfUseOrLicense originalTerms = originalVersion.getTermsOfUseOrLicense(); + if(originalTerms == null) { + originalTerms = new TermsOfUseOrLicense(); + } + // newTerms should never be null + TermsOfUseOrLicense newTerms = newVersion.getTermsOfUseOrLicense(); + if(newTerms == null) { + logger.warning("New version does not have TermsOfUseAndAccess"); + newTerms = new TermsOfUseOrLicense(); } //get license name or bundle val for none to test for differences @@ -233,37 +263,23 @@ private void getTermsDifferences() { checkAndAddToChangeList(originalLicenseName, newLicenseName, BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.license")); checkAndAddToChangeList(originalTerms.getTermsOfUse(), newTerms.getTermsOfUse(), - BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfUse.header")); + BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfUse.header")); checkAndAddToChangeList(originalTerms.getConfidentialityDeclaration(), newTerms.getConfidentialityDeclaration(), - BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfUse.addInfo.declaration")); + BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfUse.addInfo.declaration")); checkAndAddToChangeList(originalTerms.getSpecialPermissions(), newTerms.getSpecialPermissions(), - BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfUse.addInfo.permissions")); + BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfUse.addInfo.permissions")); checkAndAddToChangeList(originalTerms.getRestrictions(), newTerms.getRestrictions(), - BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfUse.addInfo.restrictions")); + BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfUse.addInfo.restrictions")); checkAndAddToChangeList(originalTerms.getCitationRequirements(), newTerms.getCitationRequirements(), - BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfUse.addInfo.citationRequirements")); + BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfUse.addInfo.citationRequirements")); checkAndAddToChangeList(originalTerms.getDepositorRequirements(), newTerms.getDepositorRequirements(), - BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfUse.addInfo.depositorRequirements")); + BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfUse.addInfo.depositorRequirements")); checkAndAddToChangeList(originalTerms.getConditions(), newTerms.getConditions(), - BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfUse.addInfo.conditions")); + BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfUse.addInfo.conditions")); checkAndAddToChangeList(originalTerms.getDisclaimer(), newTerms.getDisclaimer(), - BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfUse.addInfo.disclaimer")); - checkAndAddToChangeList(originalTerms.getTermsOfAccess(), newTerms.getTermsOfAccess(), - BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfAccess.termsOfsAccess")); - checkAndAddToChangeList(originalTerms.getDataAccessPlace(), newTerms.getDataAccessPlace(), - BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfAccess.addInfo.dataAccessPlace")); - checkAndAddToChangeList(originalTerms.getOriginalArchive(), newTerms.getOriginalArchive(), - BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfAccess.addInfo.originalArchive")); - checkAndAddToChangeList(originalTerms.getAvailabilityStatus(), newTerms.getAvailabilityStatus(), - BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfAccess.addInfo.availabilityStatus")); - checkAndAddToChangeList(originalTerms.getContactForAccess(), newTerms.getContactForAccess(), - BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfAccess.addInfo.contactForAccess")); - checkAndAddToChangeList(originalTerms.getSizeOfCollection(), newTerms.getSizeOfCollection(), - BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfAccess.addInfo.sizeOfCollection")); - checkAndAddToChangeList(originalTerms.getStudyCompletion(), newTerms.getStudyCompletion(), - BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfAccess.addInfo.studyCompletion")); + BundleUtil.getStringFromBundle("file.dataFilesTab.terms.list.termsOfUse.addInfo.disclaimer")); } - + private void checkAndAddToChangeList(String originalTerm, String newTerm, String termLabel) { originalTerm = StringUtil.nullToEmpty(originalTerm); diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java index adcc4d38c68..718c027cbc7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java @@ -353,9 +353,9 @@ public boolean isVersionDefaultCustomTerms(DatasetVersion datasetVersion) { //SEK - belt and suspenders here, but this is where the bug 10719 first manifested if (datasetVersion != null && datasetVersion.getId() != null) { try { - TermsOfUseAndAccess toua = (TermsOfUseAndAccess) em.createNamedQuery("TermsOfUseAndAccess.findByDatasetVersionIdAndDefaultTerms") - .setParameter("id", datasetVersion.getId()).setParameter("defaultTerms", TermsOfUseAndAccess.DEFAULT_NOTERMS).getSingleResult(); - if (toua != null && datasetVersion.getTermsOfUseAndAccess().getLicense() == null) { + TermsOfUseOrLicense toua = (TermsOfUseOrLicense) em.createNamedQuery("TermsOfUseOrLicense.findByDatasetVersionIdAndDefaultTerms") + .setParameter("id", datasetVersion.getId()).setParameter("defaultTerms", TermsOfUseOrLicense.DEFAULT_NOTERMS).getSingleResult(); + if (toua != null && datasetVersion.getTermsOfUseOrLicense().getLicense() == null) { return true; } diff --git a/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java b/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java index 56831834c31..52b37560e04 100644 --- a/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java @@ -778,8 +778,8 @@ public void setVersionString(String versionString) { public void restrictFiles(boolean restricted) throws UnsupportedOperationException { if (restricted) { // get values from access popup - workingVersion.getTermsOfUseAndAccess().setTermsOfAccess(termsOfAccess); - workingVersion.getTermsOfUseAndAccess().setFileAccessRequest(fileAccessRequest); + workingVersion.getTermsOfAccess().setTermsOfAccess(termsOfAccess); + workingVersion.getTermsOfAccess().setFileAccessRequest(fileAccessRequest); } String fileNames = null; @@ -852,7 +852,7 @@ public Boolean isHasValidTermsOfAccess() { hasValidTermsOfAccess = true; return hasValidTermsOfAccess; } else { - hasValidTermsOfAccess = TermsOfUseAndAccessValidator.isTOUAValid(workingVersion.getTermsOfUseAndAccess(), null); + hasValidTermsOfAccess = TermsOfAccessValidator.isTOUAValid(workingVersion.getTermsOfAccess(), null); return hasValidTermsOfAccess; } } diff --git a/src/main/java/edu/harvard/iq/dataverse/FileMetadata.java b/src/main/java/edu/harvard/iq/dataverse/FileMetadata.java index 438d889dc7f..969f553782d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FileMetadata.java +++ b/src/main/java/edu/harvard/iq/dataverse/FileMetadata.java @@ -40,6 +40,7 @@ import jakarta.persistence.ManyToOne; import jakarta.persistence.NamedNativeQuery; import jakarta.persistence.OneToMany; +import jakarta.persistence.OneToOne; import jakarta.persistence.OrderBy; import jakarta.persistence.PostLoad; import jakarta.persistence.SqlResultSetMapping; @@ -144,6 +145,10 @@ public class FileMetadata implements Serializable { @JoinColumn(nullable=false) private DataFile dataFile; + @OneToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval=true) + @JoinColumn(name = "termsofuseorlicense_id") + private TermsOfUseOrLicense termsOfUseOrLicense; + /** * There are two types of provenance types and this "free-form" type is * represented in the GUI as text box the user can type into. The other type @@ -183,10 +188,11 @@ public FileMetadata createCopyInVersion(DatasetVersion dsv) { fmd.setRestricted( isRestricted() ); fmd.setDirectoryLabel(getDirectoryLabel()); fmd.setProvFreeForm(getProvFreeForm()); + fmd.setTermsOfUseOrLicense(null); dsv.getFileMetadatas().add(fmd); return fmd; } - + public String getLabel() { getLabelNoExtension(); return label; @@ -845,5 +851,12 @@ public Set validate() { return returnSet; } - + + public TermsOfUseOrLicense getTermsOfUseOrLicense() { + return termsOfUseOrLicense; + } + + public void setTermsOfUseOrLicense(TermsOfUseOrLicense termsOfUseOrLicense) { + this.termsOfUseOrLicense = termsOfUseOrLicense; + } } diff --git a/src/main/java/edu/harvard/iq/dataverse/FilePage.java b/src/main/java/edu/harvard/iq/dataverse/FilePage.java index 698a9f94de6..733e1802bb7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FilePage.java +++ b/src/main/java/edu/harvard/iq/dataverse/FilePage.java @@ -239,8 +239,8 @@ public String init() { } } - //termsOfAccess = fileMetadata.getDatasetVersion().getTermsOfUseAndAccess().getTermsOfAccess(); - //fileAccessRequest = fileMetadata.getDatasetVersion().getTermsOfUseAndAccess().isFileAccessRequest(); + //termsOfAccess = fileMetadata.getDatasetVersion().getTermsOfAccess().getTermsOfAccess(); + //fileAccessRequest = fileMetadata.getDatasetVersion().getTermsOfAccess().isFileAccessRequest(); this.guestbookResponse = this.guestbookResponseService.initGuestbookResponseForFragment(fileMetadata, session); @@ -513,8 +513,8 @@ public String restrictFile(boolean restricted) throws CommandException{ String fileNames = null; editDataset = this.file.getOwner(); if (restricted) { // get values from access popup - editDataset.getOrCreateEditVersion().getTermsOfUseAndAccess().setTermsOfAccess(termsOfAccess); - editDataset.getOrCreateEditVersion().getTermsOfUseAndAccess().setFileAccessRequest(fileAccessRequest); + editDataset.getOrCreateEditVersion().getTermsOfAccess().setTermsOfAccess(termsOfAccess); + editDataset.getOrCreateEditVersion().getTermsOfAccess().setFileAccessRequest(fileAccessRequest); } //using this method to update the terms for datasets that are out of compliance // with Terms of Access requirement - may get her with a file that is already restricted @@ -913,7 +913,7 @@ public Boolean isHasValidTermsOfAccess() { hasValidTermsOfAccess = true; return hasValidTermsOfAccess; } else { - hasValidTermsOfAccess = TermsOfUseAndAccessValidator.isTOUAValid(fileMetadata.getDatasetVersion().getTermsOfUseAndAccess(), null); + hasValidTermsOfAccess = TermsOfAccessValidator.isTOUAValid(fileMetadata.getDatasetVersion().getTermsOfAccess(), null); return hasValidTermsOfAccess; } } diff --git a/src/main/java/edu/harvard/iq/dataverse/Template.java b/src/main/java/edu/harvard/iq/dataverse/Template.java index 5082db5e736..8b12ad2eddc 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Template.java +++ b/src/main/java/edu/harvard/iq/dataverse/Template.java @@ -113,15 +113,27 @@ public String getCreateDate() { } @OneToOne(cascade = {CascadeType.REMOVE, CascadeType.MERGE, CascadeType.PERSIST}, orphanRemoval=true) - @JoinColumn(name = "termsOfUseAndAccess_id") - private TermsOfUseAndAccess termsOfUseAndAccess; + @JoinColumn(name = "termsofaccess_id") + private TermsOfAccess termsOfAccess; - public TermsOfUseAndAccess getTermsOfUseAndAccess() { - return termsOfUseAndAccess; + public TermsOfAccess getTermsOfAccess() { + return termsOfAccess; } - public void setTermsOfUseAndAccess(TermsOfUseAndAccess termsOfUseAndAccess) { - this.termsOfUseAndAccess = termsOfUseAndAccess; + public void setTermsOfAccess(TermsOfAccess termsOfAccess) { + this.termsOfAccess = termsOfAccess; + } + + @OneToOne(cascade = {CascadeType.REMOVE, CascadeType.MERGE, CascadeType.PERSIST}, orphanRemoval=true) + @JoinColumn(name = "termsofuseorlicense_id") + private TermsOfUseOrLicense termsOfUseOrLicense; + + public TermsOfUseOrLicense getTermsOfUseOrLicense() { + return termsOfUseOrLicense; + } + + public void setTermsOfUseOrLicense(TermsOfUseOrLicense termsOfUseOrLicense) { + this.termsOfUseOrLicense = termsOfUseOrLicense; } @OneToMany(mappedBy = "template", orphanRemoval = true, cascade = {CascadeType.REMOVE, CascadeType.MERGE, CascadeType.PERSIST}) @@ -359,17 +371,26 @@ public Template cloneNewTemplate(Template source) { if (latestVersion.getDatasetFields() != null && !latestVersion.getDatasetFields().isEmpty()) { newTemplate.setDatasetFields(newTemplate.copyDatasetFields(source.getDatasetFields())); } - TermsOfUseAndAccess terms = null; - if(source.getTermsOfUseAndAccess() != null){ - terms = source.getTermsOfUseAndAccess().copyTermsOfUseAndAccess(); + TermsOfAccess termsOfAccess = null; + if(source.getTermsOfAccess() != null){ + termsOfAccess = source.getTermsOfAccess().copyTermsOfAccess(); } else { - terms = new TermsOfUseAndAccess(); - // terms.setLicense(TermsOfUseAndAccess.defaultLicense); - terms.setFileAccessRequest(true); + termsOfAccess = new TermsOfAccess(); + termsOfAccess.setFileAccessRequest(true); } - terms.setTemplate(newTemplate); - newTemplate.setTermsOfUseAndAccess(terms); + termsOfAccess.setTemplate(newTemplate); + newTemplate.setTermsOfAccess(termsOfAccess); + TermsOfUseOrLicense termsOfUseOrLicense = null; + if(source.getTermsOfUseOrLicense() != null){ + termsOfUseOrLicense = source.getTermsOfUseOrLicense().copyTermsOfUseOrLicense(); + } else { + termsOfUseOrLicense = new TermsOfUseOrLicense(); + // terms.setLicense(TermsOfUseAndAccess.defaultLicense); + } + termsOfUseOrLicense.setTemplate(newTemplate); + newTemplate.setTermsOfUseOrLicense(termsOfUseOrLicense); + newTemplate.getInstructionsMap().putAll(source.getInstructionsMap()); newTemplate.updateInstructions(); return newTemplate; diff --git a/src/main/java/edu/harvard/iq/dataverse/TemplatePage.java b/src/main/java/edu/harvard/iq/dataverse/TemplatePage.java index 279944beaa7..af56c9dfd2f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/TemplatePage.java +++ b/src/main/java/edu/harvard/iq/dataverse/TemplatePage.java @@ -135,10 +135,16 @@ public String init() { template.setDataverse(dataverse); template.setMetadataValueBlocks(settingsWrapper.getSystemMetadataBlocks()); - if (template.getTermsOfUseAndAccess() != null) { - TermsOfUseAndAccess terms = template.getTermsOfUseAndAccess().copyTermsOfUseAndAccess(); + if (template.getTermsOfAccess() != null) { + TermsOfAccess terms = template.getTermsOfAccess().copyTermsOfAccess(); terms.setTemplate(template); - template.setTermsOfUseAndAccess(terms); + template.setTermsOfAccess(terms); + } + + if (template.getTermsOfUseOrLicense() != null) { + TermsOfUseOrLicense terms = template.getTermsOfUseOrLicense().copyTermsOfUseOrLicense(); + terms.setTemplate(template); + template.setTermsOfUseOrLicense(terms); } updateDatasetFieldInputLevels(); @@ -147,11 +153,16 @@ public String init() { editMode = TemplatePage.EditMode.CREATE; template = new Template(this.dataverse, settingsWrapper.getSystemMetadataBlocks()); - TermsOfUseAndAccess terms = new TermsOfUseAndAccess(); - terms.setFileAccessRequest(true); - terms.setTemplate(template); - terms.setLicense(licenseServiceBean.getDefault()); - template.setTermsOfUseAndAccess(terms); + + TermsOfAccess toa = new TermsOfAccess(); + toa.setTemplate(template); + template.setTermsOfAccess(toa); + + TermsOfUseOrLicense toual = new TermsOfUseOrLicense(); + toual.setTemplate(template); + toual.setLicense(licenseServiceBean.getDefault()); + template.setTermsOfUseOrLicense(toual); + updateDatasetFieldInputLevels(); } else { throw new RuntimeException("On Template page without id or ownerid."); // improve error handling diff --git a/src/main/java/edu/harvard/iq/dataverse/TermsOfAccess.java b/src/main/java/edu/harvard/iq/dataverse/TermsOfAccess.java new file mode 100644 index 00000000000..c3bcaafe358 --- /dev/null +++ b/src/main/java/edu/harvard/iq/dataverse/TermsOfAccess.java @@ -0,0 +1,202 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package edu.harvard.iq.dataverse; + +import java.io.Serializable; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; + +/** + * + * + * @author skraffmi + */ +@Entity +@Table(name = "termsofaccess") +@ValidateTermsOfAccess +public class TermsOfAccess implements Serializable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + @OneToOne(mappedBy = "termsOfAccess") + private DatasetVersion datasetVersion; + + public DatasetVersion getDatasetVersion() { + return datasetVersion; + } + + public void setDatasetVersion(DatasetVersion datasetVersion) { + this.datasetVersion = datasetVersion; + } + + @OneToOne(mappedBy = "termsOfAccess") + private Template template; + + public Template getTemplate() { + return template; + } + + public void setTemplate(Template template) { + this.template = template; + } + + + @Column(name = "termsofaccess", columnDefinition = "TEXT") + private String termsOfAccess; + + @Column(name = "dataaccessplace", columnDefinition = "TEXT") + private String dataAccessPlace; + + @Column(name = "originalarchive", columnDefinition = "TEXT") + private String originalArchive; + + @Column(name = "availabilitystatus", columnDefinition = "TEXT") + private String availabilityStatus; + + @Column(name = "contactforaccess", columnDefinition = "TEXT") + private String contactForAccess; + + @Column(name = "sizeofcollection", columnDefinition = "TEXT") + private String sizeOfCollection; + + @Column(name = "studycompletion", columnDefinition = "TEXT") + private String studyCompletion; + + @Column(name = "fileaccessrequest") + private boolean fileAccessRequest; + + public boolean isFileAccessRequest() { + return fileAccessRequest; + } + + public void setFileAccessRequest(boolean fileAccessRequest) { + this.fileAccessRequest = fileAccessRequest; + } + + public String getTermsOfAccess() { + return termsOfAccess; + } + + public void setTermsOfAccess(String termsOfAccess) { + this.termsOfAccess = termsOfAccess; + } + + public String getDataAccessPlace() { + return dataAccessPlace; + } + + public void setDataAccessPlace(String dataAccessPlace) { + this.dataAccessPlace = dataAccessPlace; + } + + public String getOriginalArchive() { + return originalArchive; + } + + public void setOriginalArchive(String originalArchive) { + this.originalArchive = originalArchive; + } + + public String getAvailabilityStatus() { + return availabilityStatus; + } + + public void setAvailabilityStatus(String availabilityStatus) { + this.availabilityStatus = availabilityStatus; + } + + public String getContactForAccess() { + return contactForAccess; + } + + public void setContactForAccess(String contactForAccess) { + this.contactForAccess = contactForAccess; + } + + public String getSizeOfCollection() { + return sizeOfCollection; + } + + public void setSizeOfCollection(String sizeOfCollection) { + this.sizeOfCollection = sizeOfCollection; + } + + public String getStudyCompletion() { + return studyCompletion; + } + + public void setStudyCompletion(String studyCompletion) { + this.studyCompletion = studyCompletion; + } + + + public TermsOfAccess copyTermsOfAccess(){ + + TermsOfAccess retVal = new TermsOfAccess(); + retVal.setAvailabilityStatus(this.getAvailabilityStatus()); + retVal.setContactForAccess(this.getContactForAccess()); + retVal.setDataAccessPlace(this.getDataAccessPlace()); + retVal.setOriginalArchive(this.getOriginalArchive()); + retVal.setSizeOfCollection(this.getSizeOfCollection()); + retVal.setStudyCompletion(this.getStudyCompletion()); + retVal.setTermsOfAccess(this.getTermsOfAccess()); + retVal.setFileAccessRequest(this.isFileAccessRequest()); + return retVal; + } + + @Transient + private String validationMessage; + + public String getValidationMessage() { + return validationMessage; + } + + public void setValidationMessage(String validationMessage) { + this.validationMessage = validationMessage; + } + + @Override + public int hashCode() { + int hash = 0; + hash += (id != null ? id.hashCode() : 0); + return hash; + } + + @Override + public boolean equals(Object object) { + // TODO: Warning - this method won't work in the case the id fields are not set + if (!(object instanceof TermsOfAccess)) { + return false; + } + TermsOfAccess other = (TermsOfAccess) object; + if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { + return false; + } + return true; + } + + @Override + public String toString() { + return this.getClass().getCanonicalName() + "[ id=" + id + " ]"; + } + +} diff --git a/src/main/java/edu/harvard/iq/dataverse/TermsOfUseAndAccessValidator.java b/src/main/java/edu/harvard/iq/dataverse/TermsOfAccessValidator.java similarity index 68% rename from src/main/java/edu/harvard/iq/dataverse/TermsOfUseAndAccessValidator.java rename to src/main/java/edu/harvard/iq/dataverse/TermsOfAccessValidator.java index ca38a305d63..bca89f240da 100644 --- a/src/main/java/edu/harvard/iq/dataverse/TermsOfUseAndAccessValidator.java +++ b/src/main/java/edu/harvard/iq/dataverse/TermsOfAccessValidator.java @@ -13,35 +13,35 @@ * * @author skraffmi */ -public class TermsOfUseAndAccessValidator implements ConstraintValidator { +public class TermsOfAccessValidator implements ConstraintValidator { @Override - public void initialize(ValidateTermsOfUseAndAccess constraintAnnotation) { + public void initialize(ValidateTermsOfAccess constraintAnnotation) { } @Override - public boolean isValid(TermsOfUseAndAccess value, ConstraintValidatorContext context) { - + public boolean isValid(TermsOfAccess value, ConstraintValidatorContext context) { + return isTOUAValid(value, context); } - - public static boolean isTOUAValid(TermsOfUseAndAccess value, ConstraintValidatorContext context){ - + + public static boolean isTOUAValid(TermsOfAccess value, ConstraintValidatorContext context){ + //if part of a template it is valid if (value.getTemplate() != null){ return true; } - - //If there are no restricted files then terms are valid + + //If there are no restricted files then terms are valid if (!value.getDatasetVersion().isHasRestrictedFile()) { return true; } /*If there are restricted files then the version - must allow access requests or have terms of access filled in. + must have terms of access filled in. */ - boolean valid = value.isFileAccessRequest() == true || (value.getTermsOfAccess() != null && !value.getTermsOfAccess().isEmpty()); + boolean valid = value.isFileAccessRequest() || (value.getTermsOfAccess() != null && !value.getTermsOfAccess().isEmpty()); if (!valid) { try { if (context != null) { @@ -57,3 +57,4 @@ public static boolean isTOUAValid(TermsOfUseAndAccess value, ConstraintValidator return valid; } } + diff --git a/src/main/java/edu/harvard/iq/dataverse/TermsOfUseAndAccess.java b/src/main/java/edu/harvard/iq/dataverse/TermsOfUseOrLicense.java similarity index 65% rename from src/main/java/edu/harvard/iq/dataverse/TermsOfUseAndAccess.java rename to src/main/java/edu/harvard/iq/dataverse/TermsOfUseOrLicense.java index c1e76aee2ab..bdab9c8ff27 100644 --- a/src/main/java/edu/harvard/iq/dataverse/TermsOfUseAndAccess.java +++ b/src/main/java/edu/harvard/iq/dataverse/TermsOfUseOrLicense.java @@ -14,23 +14,23 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; import jakarta.persistence.Transient; import edu.harvard.iq.dataverse.license.License; import jakarta.persistence.NamedQueries; import jakarta.persistence.NamedQuery; - @NamedQueries({ - // TermsOfUseAndAccess.findByDatasetVersionIdAndDefaultTerms - // is used to determine if the dataset terms were set by the multi license support update + // TermsOfUseOrLicense.findByDatasetVersionIdAndDefaultTerms + // is used to determine if the dataset terms were set by the multi license support update // as part of the 5.10 release. - - @NamedQuery(name = "TermsOfUseAndAccess.findByDatasetVersionIdAndDefaultTerms", - query = "SELECT o FROM TermsOfUseAndAccess o, DatasetVersion dv WHERE " + + @NamedQuery(name = "TermsOfUseOrLicense.findByDatasetVersionIdAndDefaultTerms", + query = "SELECT o FROM TermsOfUseOrLicense o, DatasetVersion dv WHERE " + "dv.id =:id " - + "AND dv.termsOfUseAndAccess.id = o.id " + + "AND dv.termsOfUseOrLicense.id = o.id " + "AND o.termsOfUse =:defaultTerms " - + "AND o.confidentialityDeclaration IS null " + + "AND o.confidentialityDeclaration IS null " + "AND o.specialPermissions IS null " + "AND o.restrictions IS null " + "AND o.citationRequirements IS null " @@ -42,13 +42,12 @@ /** * - * + * * @author skraffmi */ @Entity -@ValidateTermsOfUseAndAccess -public class TermsOfUseAndAccess implements Serializable { - +@Table(name = "termsofuseorlicense") +public class TermsOfUseOrLicense implements Serializable { public static final String DEFAULT_NOTERMS = "This dataset is made available without information on how it can be used. You should communicate with the Contact(s) specified before use."; @Id @@ -62,8 +61,8 @@ public Long getId() { public void setId(Long id) { this.id = id; } - - @OneToOne(mappedBy = "termsOfUseAndAccess") + + @OneToOne(mappedBy = "termsOfUseOrLicense") private DatasetVersion datasetVersion; public DatasetVersion getDatasetVersion() { @@ -73,8 +72,8 @@ public DatasetVersion getDatasetVersion() { public void setDatasetVersion(DatasetVersion datasetVersion) { this.datasetVersion = datasetVersion; } - - @OneToOne(mappedBy = "termsOfUseAndAccess") + + @OneToOne(mappedBy = "termsOfUseOrLicense") private Template template; public Template getTemplate() { @@ -84,66 +83,35 @@ public Template getTemplate() { public void setTemplate(Template template) { this.template = template; } - + @ManyToOne - @JoinColumn(name="license_id") + @JoinColumn(name = "license_id") private License license; - @Column(columnDefinition="TEXT") + @Column(name = "termsofuse", columnDefinition = "TEXT") private String termsOfUse; - - @Column(columnDefinition="TEXT") - private String termsOfAccess; - - @Column(columnDefinition="TEXT") + + @Column(name = "confidentialitydeclaration", columnDefinition = "TEXT") private String confidentialityDeclaration; - - @Column(columnDefinition="TEXT") + + @Column(name = "specialpermissions", columnDefinition = "TEXT") private String specialPermissions; - - @Column(columnDefinition="TEXT") + + @Column(name = "restrictions", columnDefinition = "TEXT") private String restrictions; - - @Column(columnDefinition="TEXT") + + @Column(name = "citationrequirements", columnDefinition = "TEXT") private String citationRequirements; - - @Column(columnDefinition="TEXT") + + @Column(name = "depositorrequirements", columnDefinition = "TEXT") private String depositorRequirements; - - @Column(columnDefinition="TEXT") + + @Column(name = "conditions", columnDefinition = "TEXT") private String conditions; - - @Column(columnDefinition="TEXT") + + @Column(name = "disclaimer", columnDefinition = "TEXT") private String disclaimer; - - @Column(columnDefinition="TEXT") - private String dataAccessPlace; - - @Column(columnDefinition="TEXT") - private String originalArchive; - - @Column(columnDefinition="TEXT") - private String availabilityStatus; - - @Column(columnDefinition="TEXT") - private String contactForAccess; - - @Column(columnDefinition="TEXT") - private String sizeOfCollection; - - @Column(columnDefinition="TEXT") - private String studyCompletion; - - private boolean fileAccessRequest; - - public boolean isFileAccessRequest() { - return fileAccessRequest; - } - public void setFileAccessRequest(boolean fileAccessRequest) { - this.fileAccessRequest = fileAccessRequest; - } - public License getLicense() { return license; } @@ -168,14 +136,6 @@ public void setTermsOfUse(String termsOfUse) { } } - public String getTermsOfAccess() { - return termsOfAccess; - } - - public void setTermsOfAccess(String termsOfAccess) { - this.termsOfAccess = termsOfAccess; - } - public String getConfidentialityDeclaration() { return confidentialityDeclaration; } @@ -260,66 +220,9 @@ public void setDisclaimer(String disclaimer) { } } - public String getDataAccessPlace() { - return dataAccessPlace; - } + public TermsOfUseOrLicense copyTermsOfUseOrLicense(){ - public void setDataAccessPlace(String dataAccessPlace) { - this.dataAccessPlace = dataAccessPlace; - } - - public String getOriginalArchive() { - return originalArchive; - } - - public void setOriginalArchive(String originalArchive) { - this.originalArchive = originalArchive; - } - - public String getAvailabilityStatus() { - return availabilityStatus; - } - - public void setAvailabilityStatus(String availabilityStatus) { - this.availabilityStatus = availabilityStatus; - } - - public String getContactForAccess() { - return contactForAccess; - } - - public void setContactForAccess(String contactForAccess) { - this.contactForAccess = contactForAccess; - } - - public String getSizeOfCollection() { - return sizeOfCollection; - } - - public void setSizeOfCollection(String sizeOfCollection) { - this.sizeOfCollection = sizeOfCollection; - } - - public String getStudyCompletion() { - return studyCompletion; - } - - public void setStudyCompletion(String studyCompletion) { - this.studyCompletion = studyCompletion; - } - - - public TermsOfUseAndAccess copyTermsOfUseAndAccess(){ - - TermsOfUseAndAccess retVal = new TermsOfUseAndAccess(); - retVal.setAvailabilityStatus(this.getAvailabilityStatus()); - retVal.setContactForAccess(this.getContactForAccess()); - retVal.setDataAccessPlace(this.getDataAccessPlace()); - retVal.setOriginalArchive(this.getOriginalArchive()); - retVal.setSizeOfCollection(this.getSizeOfCollection()); - retVal.setStudyCompletion(this.getStudyCompletion()); - retVal.setTermsOfAccess(this.getTermsOfAccess()); - retVal.setFileAccessRequest(this.isFileAccessRequest()); + TermsOfUseOrLicense retVal = new TermsOfUseOrLicense(); retVal.setLicense(this.getLicense()); if (license == null) { retVal.setTermsOfUse(this.getTermsOfUse()); @@ -345,7 +248,7 @@ private void clearCustomTermsVariables(){ conditions = null; disclaimer = null; } - + @Transient private String validationMessage; @@ -356,7 +259,7 @@ public String getValidationMessage() { public void setValidationMessage(String validationMessage) { this.validationMessage = validationMessage; } - + @Override public int hashCode() { int hash = 0; @@ -367,10 +270,10 @@ public int hashCode() { @Override public boolean equals(Object object) { // TODO: Warning - this method won't work in the case the id fields are not set - if (!(object instanceof TermsOfUseAndAccess)) { + if (!(object instanceof TermsOfUseOrLicense)) { return false; } - TermsOfUseAndAccess other = (TermsOfUseAndAccess) object; + TermsOfUseOrLicense other = (TermsOfUseOrLicense) object; if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { return false; } @@ -379,7 +282,8 @@ public boolean equals(Object object) { @Override public String toString() { - return "edu.harvard.iq.dataverse.TermsOfUseAndAccess[ id=" + id + " ]"; + return this.getClass().getCanonicalName() + "[ id=" + id + " ]"; } - + } + diff --git a/src/main/java/edu/harvard/iq/dataverse/ValidateTermsOfUseAndAccess.java b/src/main/java/edu/harvard/iq/dataverse/ValidateTermsOfAccess.java similarity index 87% rename from src/main/java/edu/harvard/iq/dataverse/ValidateTermsOfUseAndAccess.java rename to src/main/java/edu/harvard/iq/dataverse/ValidateTermsOfAccess.java index f55e93af674..e74e3cb0be2 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ValidateTermsOfUseAndAccess.java +++ b/src/main/java/edu/harvard/iq/dataverse/ValidateTermsOfAccess.java @@ -19,9 +19,9 @@ */ @Target({TYPE}) @Retention(RUNTIME) -@Constraint(validatedBy = {TermsOfUseAndAccessValidator.class}) +@Constraint(validatedBy = {TermsOfAccessValidator.class}) @Documented -public @interface ValidateTermsOfUseAndAccess { +public @interface ValidateTermsOfAccess { String message() default "Failed Validation Terms Of Use and Access"; 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 cdb27fd5f21..20106018075 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Access.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Access.java @@ -35,6 +35,7 @@ import jakarta.ejb.EJB; import jakarta.inject.Inject; import jakarta.json.*; +import jakarta.json.JsonObjectBuilder; import jakarta.persistence.TypedQuery; import jakarta.servlet.http.HttpServletResponse; import jakarta.ws.rs.*; @@ -1797,7 +1798,7 @@ public Response allowAccessRequest(@Context ContainerRequestContext crc, dataverseRequest = createDataverseRequest(getRequestUser(crc)); - dataset.getOrCreateEditVersion().getTermsOfUseAndAccess().setFileAccessRequest(allowRequest); + dataset.getOrCreateEditVersion().getTermsOfAccess().setFileAccessRequest(allowRequest); try { engineSvc.submit(new UpdateDatasetVersionCommand(dataset, dataverseRequest)); 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 1b549b10a6b..325194a01eb 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -938,16 +938,18 @@ public Response updateDraftVersion(@Context ContainerRequestContext crc, if (updateDraft) { final DatasetVersion editVersion = ds.getOrCreateEditVersion(); editVersion.setDatasetFields(incomingVersion.getDatasetFields()); - editVersion.setTermsOfUseAndAccess(incomingVersion.getTermsOfUseAndAccess()); - editVersion.getTermsOfUseAndAccess().setDatasetVersion(editVersion); - boolean hasValidTerms = TermsOfUseAndAccessValidator.isTOUAValid(editVersion.getTermsOfUseAndAccess(), null); + editVersion.setTermsOfAccess(incomingVersion.getTermsOfAccess()); + editVersion.getTermsOfAccess().setDatasetVersion(editVersion); + editVersion.setTermsOfUseOrLicense(incomingVersion.getTermsOfUseOrLicense()); + editVersion.getTermsOfUseOrLicense().setDatasetVersion(editVersion); + boolean hasValidTerms = TermsOfAccessValidator.isTOUAValid(editVersion.getTermsOfAccess(), null); if (!hasValidTerms) { return error(Status.CONFLICT, BundleUtil.getStringFromBundle("dataset.message.toua.invalid")); } Dataset managedDataset = execCommand(new UpdateDatasetVersionCommand(ds, req)); managedVersion = managedDataset.getOrCreateEditVersion(); } else { - boolean hasValidTerms = TermsOfUseAndAccessValidator.isTOUAValid(incomingVersion.getTermsOfUseAndAccess(), null); + boolean hasValidTerms = TermsOfAccessValidator.isTOUAValid(incomingVersion.getTermsOfAccess(), null); if (!hasValidTerms) { return error(Status.CONFLICT, BundleUtil.getStringFromBundle("dataset.message.toua.invalid")); } @@ -1030,8 +1032,9 @@ public Response updateVersionMetadata(@Context ContainerRequestContext crc, //Get the current draft or create a new version to update DatasetVersion dsv = ds.getOrCreateEditVersion(); dsv = JSONLDUtil.updateDatasetVersionMDFromJsonLD(dsv, jsonLDBody, metadataBlockService, datasetFieldSvc, !replaceTerms, false, licenseSvc); - dsv.getTermsOfUseAndAccess().setDatasetVersion(dsv); - boolean hasValidTerms = TermsOfUseAndAccessValidator.isTOUAValid(dsv.getTermsOfUseAndAccess(), null); + dsv.getTermsOfAccess().setDatasetVersion(dsv); + dsv.getTermsOfUseOrLicense().setDatasetVersion(dsv); + boolean hasValidTerms = TermsOfAccessValidator.isTOUAValid(dsv.getTermsOfAccess(), null); if (!hasValidTerms) { return error(Status.CONFLICT, BundleUtil.getStringFromBundle("dataset.message.toua.invalid")); } @@ -1069,7 +1072,8 @@ public Response deleteMetadata(@Context ContainerRequestContext crc, //Get the current draft or create a new version to update DatasetVersion dsv = ds.getOrCreateEditVersion(); dsv = JSONLDUtil.deleteDatasetVersionMDFromJsonLD(dsv, jsonLDBody, metadataBlockService, licenseSvc); - dsv.getTermsOfUseAndAccess().setDatasetVersion(dsv); + dsv.getTermsOfAccess().setDatasetVersion(dsv); + dsv.getTermsOfUseOrLicense().setDatasetVersion(dsv); DatasetVersion managedVersion; Dataset managedDataset = execCommand(new UpdateDatasetVersionCommand(ds, req)); managedVersion = managedDataset.getLatestVersion(); @@ -1108,8 +1112,9 @@ private Response processDatasetFieldDataDelete(String jsonBody, String id, Datav Dataset ds = findDatasetOrDie(id); JsonObject json = JsonUtil.getJsonObject(jsonBody); //Get the current draft or create a new version to update - DatasetVersion dsv = ds.getOrCreateEditVersion(); - dsv.getTermsOfUseAndAccess().setDatasetVersion(dsv); + DatasetVersion dsv = ds.getOrCreateEditVersion(); + dsv.getTermsOfAccess().setDatasetVersion(dsv); + dsv.getTermsOfUseOrLicense().setDatasetVersion(dsv); List fields = new LinkedList<>(); DatasetField singleField = null; @@ -1313,13 +1318,13 @@ public Response editVersionTermsOfAccess(@Context ContainerRequestContext crc, JsonObject json = JsonUtil.getJsonObject(jsonBody); - TermsOfUseAndAccess toua = jsonParser().parseTermsOfAccess(json); + TermsOfAccess toa = jsonParser().parseTermsOfAccess(json); - if (publicInstall && (toua.isFileAccessRequest() || !toua.getTermsOfAccess().isEmpty())){ + if (publicInstall && (toa.isFileAccessRequest() || !toa.getTermsOfAccess().isEmpty())){ return error(BAD_REQUEST, "Setting File Access Request or Terms of Access is not permitted on a public installation."); } - DatasetVersion updatedVersion = execCommand(new UpdateDatasetTermsOfAccessCommand(dataset, toua, createDataverseRequest(getRequestUser(crc)))).getLatestVersion(); + DatasetVersion updatedVersion = execCommand(new UpdateDatasetTermsOfAccessCommand(dataset, toa, createDataverseRequest(getRequestUser(crc)))).getLatestVersion(); return ok(json(updatedVersion, true)); @@ -1390,8 +1395,7 @@ public Response publishDataset(@Context ContainerRequestContext crc, Dataset ds = findDatasetOrDie(id); - boolean hasValidTerms = TermsOfUseAndAccessValidator.isTOUAValid(ds.getLatestVersion().getTermsOfUseAndAccess(), null); - if (!hasValidTerms) { + if (!TermsOfAccessValidator.isTOUAValid(ds.getLatestVersion().getTermsOfAccess(), null)) { return error(Status.CONFLICT, BundleUtil.getStringFromBundle("dataset.message.toua.invalid")); } @@ -1643,9 +1647,7 @@ public Response createFileEmbargo(@Context ContainerRequestContext crc, @Paramet return ex.getResponse(); } - boolean hasValidTerms = TermsOfUseAndAccessValidator.isTOUAValid(dataset.getLatestVersion().getTermsOfUseAndAccess(), null); - - if (!hasValidTerms){ + if (!TermsOfAccessValidator.isTOUAValid(dataset.getLatestVersion().getTermsOfAccess(), null)){ return error(Status.CONFLICT, BundleUtil.getStringFromBundle("dataset.message.toua.invalid")); } @@ -1935,9 +1937,7 @@ public Response createFileRetention(@Context ContainerRequestContext crc, @Param return ex.getResponse(); } - boolean hasValidTerms = TermsOfUseAndAccessValidator.isTOUAValid(dataset.getLatestVersion().getTermsOfUseAndAccess(), null); - - if (!hasValidTerms){ + if (!TermsOfAccessValidator.isTOUAValid(dataset.getLatestVersion().getTermsOfAccess(), null)){ return error(Status.CONFLICT, BundleUtil.getStringFromBundle("dataset.message.toua.invalid")); } @@ -6748,7 +6748,7 @@ public Response updateLicense(@Context ContainerRequestContext crc, return ok(BundleUtil.getStringFromBundle("datasets.api.updateLicense.success")); } else if (requestBody.getCustomTerms() != null) { CustomTermsDTO customTerms = requestBody.getCustomTerms(); - execCommand(new UpdateDatasetLicenseCommand(req, dataset, customTerms.toTermsOfUseAndAccess())); + execCommand(new UpdateDatasetLicenseCommand(req, dataset, customTerms.toTermsOfUseOrLicense())); return ok(BundleUtil.getStringFromBundle("datasets.api.updateLicense.success")); } else { return badRequest(BundleUtil.getStringFromBundle("datasets.api.updateLicense.licenseNameIsEmpty")); 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..4758622401e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java @@ -445,8 +445,9 @@ public Response createDataset(@Context ContainerRequestContext crc, version.setMinorVersionNumber(null); version.setVersionNumber(null); version.setVersionState(DatasetVersion.VersionState.DRAFT); - version.getTermsOfUseAndAccess().setFileAccessRequest(true); - version.getTermsOfUseAndAccess().setDatasetVersion(version); + version.getTermsOfAccess().setFileAccessRequest(true); + version.getTermsOfAccess().setDatasetVersion(version); + version.getTermsOfUseOrLicense().setDatasetVersion(version); ds.setAuthority(null); ds.setIdentifier(null); @@ -512,8 +513,9 @@ public Response createDatasetFromJsonLd(@Context ContainerRequestContext crc, version.setMinorVersionNumber(null); version.setVersionNumber(null); version.setVersionState(DatasetVersion.VersionState.DRAFT); - version.getTermsOfUseAndAccess().setFileAccessRequest(true); - version.getTermsOfUseAndAccess().setDatasetVersion(version); + version.getTermsOfAccess().setFileAccessRequest(true); + version.getTermsOfAccess().setDatasetVersion(version); + version.getTermsOfUseOrLicense().setDatasetVersion(version); ds.setAuthority(null); ds.setIdentifier(null); @@ -2426,7 +2428,7 @@ public Response updateTemplateLicenseTerms(@Context ContainerRequestContext crc, return ok(BundleUtil.getStringFromBundle("dataverses.api.update.template.license.success")); } else if (requestBody.getCustomTerms() != null) { CustomTermsDTO customTerms = requestBody.getCustomTerms(); - execCommand(new UpdateTemplateLicenseCommand(createDataverseRequest(getRequestUser(crc)), template, dataverse, customTerms.toTermsOfUseAndAccess())); + execCommand(new UpdateTemplateLicenseCommand(createDataverseRequest(getRequestUser(crc)), template, dataverse, customTerms.toTermsOfUseOrLicense())); return ok(BundleUtil.getStringFromBundle("dataverses.api.update.template.license.success")); } else { return badRequest(BundleUtil.getStringFromBundle("datasets.api.updateLicense.licenseNameIsEmpty")); @@ -2455,7 +2457,7 @@ public Response updateTemplateTermsOfAccess(@Context ContainerRequestContext crc JsonObject json = JsonUtil.getJsonObject(jsonBody); - TermsOfUseAndAccess toua = jsonParser().parseTermsOfAccess(json); + TermsOfAccess toua = jsonParser().parseTermsOfAccess(json); if (publicInstall && (toua.isFileAccessRequest() || !toua.getTermsOfAccess().isEmpty())){ return error(BAD_REQUEST, "Setting File Access Request or Terms of Access is not permitted on a public installation."); 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 458faf790ec..ba08b99ea58 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Files.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Files.java @@ -197,7 +197,7 @@ public Response restrictFileInDataset(@Context ContainerRequestContext crc, engineSvc.submit(new UpdateDatasetVersionCommand(dataFile.getOwner(), dataverseRequest)); } catch (IllegalCommandException ex) { //special case where terms of use are out of compliance - if (!TermsOfUseAndAccessValidator.isTOUAValid(dataFile.getOwner().getLatestVersion().getTermsOfUseAndAccess(), null)) { + if (!TermsOfAccessValidator.isTOUAValid(dataFile.getOwner().getLatestVersion().getTermsOfAccess(), null)) { return conflict(BundleUtil.getStringFromBundle("dataset.message.toua.invalid")); } return error(BAD_REQUEST, "Problem saving datafile " + dataFile.getDisplayName() + ": " + ex.getLocalizedMessage()); 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 95763e0eafb..576785656b1 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 @@ -74,7 +74,8 @@ public Statement getStatement(String editUri, Map map, AuthCrede // in the statement, the element is called "updated" Date lastUpdatedFinal = new Date(); Date lastUpdateTime = dataset.getLatestVersion().getLastUpdateTime(); - dataset.getLatestVersion().getTermsOfUseAndAccess().setDatasetVersion(dataset.getLatestVersion()); + dataset.getLatestVersion().getTermsOfAccess().setDatasetVersion(dataset.getLatestVersion()); + dataset.getLatestVersion().getTermsOfUseOrLicense().setDatasetVersion(dataset.getLatestVersion()); if (lastUpdateTime != null) { lastUpdatedFinal = lastUpdateTime; } else { 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 22b6ee05e48..92c9b7eeede 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 @@ -6,7 +6,8 @@ import edu.harvard.iq.dataverse.DatasetFieldServiceBean; import edu.harvard.iq.dataverse.DatasetFieldType; import edu.harvard.iq.dataverse.DatasetVersion; -import edu.harvard.iq.dataverse.TermsOfUseAndAccess; +import edu.harvard.iq.dataverse.TermsOfAccess; +import edu.harvard.iq.dataverse.TermsOfUseOrLicense; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.authorization.users.User; import edu.harvard.iq.dataverse.dataset.DatasetUtil; @@ -159,10 +160,14 @@ public void setDatasetLicenseAndTermsOfUse(DatasetVersion datasetVersionToMutate throw new SwordError("Custom Terms (dcterms:rights) are not allowed."); } - TermsOfUseAndAccess terms = new TermsOfUseAndAccess(); - datasetVersionToMutate.setTermsOfUseAndAccess(terms); - terms.setDatasetVersion(datasetVersionToMutate); - + TermsOfAccess termsOfAccess = new TermsOfAccess(); + datasetVersionToMutate.setTermsOfAccess(termsOfAccess); + termsOfAccess.setDatasetVersion(datasetVersionToMutate); + + TermsOfUseOrLicense termsOfUseOrLicense = new TermsOfUseOrLicense(); + datasetVersionToMutate.setTermsOfUseOrLicense(termsOfUseOrLicense); + termsOfUseOrLicense.setDatasetVersion(datasetVersionToMutate); + if (listOfLicensesProvided == null) { License existingLicense = DatasetUtil.getLicense(datasetVersionToMutate); if (existingLicense != null) { @@ -180,9 +185,9 @@ public void setDatasetLicenseAndTermsOfUse(DatasetVersion datasetVersionToMutate defaultLicense = null; } } - terms.setLicense(defaultLicense); - terms.setFileAccessRequest(datasetVersionToMutate.getTermsOfUseAndAccess().isFileAccessRequest()); - terms.setDatasetVersion(datasetVersionToMutate); + termsOfUseOrLicense.setLicense(defaultLicense); + termsOfAccess.setFileAccessRequest(datasetVersionToMutate.getTermsOfAccess().isFileAccessRequest()); + termsOfAccess.setDatasetVersion(datasetVersionToMutate); setTermsOfUse(datasetVersionToMutate, dcterms, defaultLicense); } return; @@ -196,7 +201,7 @@ public void setDatasetLicenseAndTermsOfUse(DatasetVersion datasetVersionToMutate throw new SwordError("License provided was blank."); } if (StringUtils.equalsIgnoreCase(licenseProvided, BundleUtil.getStringFromBundle("license.custom"))){ - terms.setLicense(null); + termsOfUseOrLicense.setLicense(null); setTermsOfUse(datasetVersionToMutate, dcterms, null); } else { License licenseToSet = licenseServiceBean.getByNameOrUri(licenseProvided); @@ -207,14 +212,14 @@ public void setDatasetLicenseAndTermsOfUse(DatasetVersion datasetVersionToMutate } throw new SwordError("Couldn't find an active license with: " + licenseProvided + ". Valid licenses: " + licenses); } - terms.setLicense(licenseToSet); + termsOfUseOrLicense.setLicense(licenseToSet); setTermsOfUse(datasetVersionToMutate, dcterms, licenseToSet); } } private void setTermsOfUse(DatasetVersion datasetVersionToMutate, Map> dcterms, License providedLicense) throws SwordError { if (providedLicense != null) { - String existingTermsOfUse = datasetVersionToMutate.getTermsOfUseAndAccess().getTermsOfUse(); + String existingTermsOfUse = datasetVersionToMutate.getTermsOfUseOrLicense().getTermsOfUse(); if (existingTermsOfUse != null) { throw new SwordError("Can not change license to \"" + providedLicense.getName() + "\" due to existing Terms of Use (dcterms:rights): \"" + existingTermsOfUse + "\". You can specify a Custom license."); } @@ -240,7 +245,7 @@ private void setTermsOfUse(DatasetVersion datasetVersionToMutate, Map cv.getRootBean() instanceof TermsOfUseAndAccess) + .filter(cv -> cv.getRootBean() instanceof TermsOfAccess) .map(cv -> cv.toString()); for (ConstraintViolation cv : constraintViolations){ - if (cv.getRootBean() instanceof TermsOfUseAndAccess){ + if (cv.getRootBean() instanceof TermsOfAccess){ throw new IllegalCommandException(validationMessage, this); } } diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateTemplateCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateTemplateCommand.java index 35f562ff84c..d62fa8116a3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateTemplateCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateTemplateCommand.java @@ -42,7 +42,8 @@ public Template execute(CommandContext ctxt) throws CommandException { template.setDataverse(dataverse); template.setMetadataValueBlocks(getSystemMetadataBlocks(ctxt)); - updateTermsOfUseAndAccess(ctxt, template); + updateTermsOfUseOrLicense(ctxt, template); + updateTermsOfAccess(ctxt, template); updateDatasetFieldInputLevels(template, ctxt); DatasetFieldUtil.tidyUpFields(template.getDatasetFields(), false); @@ -61,12 +62,18 @@ public Template execute(CommandContext ctxt) throws CommandException { return createdTemplate; } - private static void updateTermsOfUseAndAccess(CommandContext ctxt, Template template) { - TermsOfUseAndAccess terms = new TermsOfUseAndAccess(); - terms.setFileAccessRequest(true); - terms.setTemplate(template); - terms.setLicense(ctxt.licenses().getDefault()); - template.setTermsOfUseAndAccess(terms); + private static void updateTermsOfUseOrLicense(CommandContext ctxt, Template template) { + TermsOfUseOrLicense touol = new TermsOfUseOrLicense(); + touol.setTemplate(template); + touol.setLicense(ctxt.licenses().getDefault()); + template.setTermsOfUseOrLicense(touol); + } + + private static void updateTermsOfAccess(CommandContext ctxt, Template template) { + var toa = new TermsOfAccess(); + toa.setFileAccessRequest(true); + toa.setTemplate(template); + template.setTermsOfAccess(toa); } private void updateDatasetFieldInputLevels(Template template, CommandContext ctxt) { diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CuratePublishedDatasetVersionCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CuratePublishedDatasetVersionCommand.java index 1c57a9d4647..eea538738eb 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CuratePublishedDatasetVersionCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CuratePublishedDatasetVersionCommand.java @@ -1,5 +1,7 @@ package edu.harvard.iq.dataverse.engine.command.impl; +import edu.harvard.iq.dataverse.CurationStatus; +import edu.harvard.iq.dataverse.TermsOfUseOrLicense; import edu.harvard.iq.dataverse.authorization.Permission; import edu.harvard.iq.dataverse.engine.command.CommandContext; import edu.harvard.iq.dataverse.engine.command.DataverseRequest; @@ -14,8 +16,7 @@ import edu.harvard.iq.dataverse.Dataset; import edu.harvard.iq.dataverse.DatasetField; import edu.harvard.iq.dataverse.DatasetVersion; -import edu.harvard.iq.dataverse.TermsOfUseAndAccess; -import edu.harvard.iq.dataverse.CurationStatus; +import edu.harvard.iq.dataverse.TermsOfAccess; import edu.harvard.iq.dataverse.DataFile; import edu.harvard.iq.dataverse.FileMetadata; import edu.harvard.iq.dataverse.RoleAssignment; @@ -71,17 +72,31 @@ public Dataset execute(CommandContext ctxt) throws CommandException { // final DatasetVersion editVersion = getDataset().getEditVersion(); DatasetFieldUtil.tidyUpFields(updateVersion.getDatasetFields(), true); - TermsOfUseAndAccess oldTerms = updateVersion.getTermsOfUseAndAccess(); - TermsOfUseAndAccess newTerms = newVersion.getTermsOfUseAndAccess(); - newTerms.setDatasetVersion(updateVersion); - updateVersion.setTermsOfUseAndAccess(newTerms); + // Merge the new version into our JPA context + ctxt.em().merge(updateVersion); + + TermsOfAccess oldTermsOfAccess = updateVersion.getTermsOfAccess(); + TermsOfAccess newTermsOfAccess = newVersion.getTermsOfAccess(); + newTermsOfAccess.setDatasetVersion(updateVersion); + updateVersion.setTermsOfAccess(newTermsOfAccess); + //Put old terms on version that will be deleted.... + newVersion.setTermsOfAccess(oldTermsOfAccess); + TermsOfUseOrLicense oldTermsOfUseOrLicense = updateVersion.getTermsOfUseOrLicense(); + TermsOfUseOrLicense newTermsOfUseOrLicense = newVersion.getTermsOfUseOrLicense(); + newTermsOfUseOrLicense.setDatasetVersion(updateVersion); + updateVersion.setTermsOfUseOrLicense(newTermsOfUseOrLicense); + //Put old terms on version that will be deleted.... + newVersion.setTermsOfUseOrLicense(oldTermsOfUseOrLicense); + //Version Note updateVersion.setVersionNote(newVersion.getVersionNote()); - + // Clear unnecessary terms relationships .... - newVersion.setTermsOfUseAndAccess(null); - oldTerms.setDatasetVersion(null); + newVersion.setTermsOfUseOrLicense(null); + newVersion.setTermsOfAccess(null); + oldTermsOfAccess.setDatasetVersion(null); + oldTermsOfUseOrLicense.setDatasetVersion(null); // Without this there's a db exception related to the oldTerms being referenced // by the datasetversion table at the flush around line 212 ctxt.em().flush(); @@ -90,7 +105,7 @@ public Dataset execute(CommandContext ctxt) throws CommandException { validateOrDie(updateVersion, isValidateLenient()); //Also set the fileaccessrequest boolean on the dataset to match the new terms - getDataset().setFileAccessRequest(updateVersion.getTermsOfUseAndAccess().isFileAccessRequest()); + getDataset().setFileAccessRequest(updateVersion.getTermsOfAccess().isFileAccessRequest()); List newComments = newVersion.getWorkflowComments(); if (newComments!=null && newComments.size() >0) { for(WorkflowComment wfc: newComments) { @@ -116,12 +131,12 @@ public Dataset execute(CommandContext ctxt) throws CommandException { if (status != null && StringUtils.isNotBlank(status.getLabel())) { updateVersion.addCurationStatus(new CurationStatus(null, updateVersion, getRequest().getAuthenticatedUser())); } - + // we have to merge to update the database but not flush because // we don't want to create two draft versions! Dataset tempDataset = getDataset(); updateVersion = tempDataset.getLatestVersionForCopy(); - + // Look for file metadata changes and update published metadata if needed List pubFmds = updateVersion.getFileMetadatas(); int pubFileCount = pubFmds.size(); @@ -231,7 +246,7 @@ public Dataset execute(CommandContext ctxt) throws CommandException { setDataset(savedDataset); updateDatasetUser(ctxt); - + // ToDo - see if there are other DatasetVersionUser entries unique to the draft // version that should be moved to the last published version // As this command is intended for minor fixes, often done by the person pushing @@ -244,7 +259,7 @@ public Dataset execute(CommandContext ctxt) throws CommandException { public boolean onSuccess(CommandContext ctxt, Object r) { boolean retVal = true; Dataset d = (Dataset) r; - + ctxt.index().asyncIndexDataset(d, true); // And the exported metadata files 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 be47861316f..a52b6d025f0 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 @@ -167,7 +167,7 @@ public Dataset execute(CommandContext ctxt) throws CommandException { } version.setLastUpdateTime(getTimestamp()); theDataset.setModificationTime(getTimestamp()); - theDataset.setFileAccessRequest(theDataset.getLatestVersion().getTermsOfUseAndAccess().isFileAccessRequest()); + theDataset.setFileAccessRequest(theDataset.getLatestVersion().getTermsOfAccess().isFileAccessRequest()); //Use dataset pub date (which may not be the current date for migrated datasets) updateFiles(new Timestamp(version.getReleaseTime().getTime()), ctxt); diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/PublishDatasetCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/PublishDatasetCommand.java index df7cbc94c8d..5dcbd2fe742 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/PublishDatasetCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/PublishDatasetCommand.java @@ -1,6 +1,7 @@ package edu.harvard.iq.dataverse.engine.command.impl; import edu.harvard.iq.dataverse.*; +import edu.harvard.iq.dataverse.TermsOfUseOrLicense; import edu.harvard.iq.dataverse.authorization.Permission; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.engine.command.CommandContext; @@ -8,11 +9,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.settings.SettingsServiceBean; import edu.harvard.iq.dataverse.util.BundleUtil; import edu.harvard.iq.dataverse.workflow.Workflow; import edu.harvard.iq.dataverse.workflow.WorkflowContext; import edu.harvard.iq.dataverse.workflow.WorkflowContext.TriggerType; - import jakarta.persistence.OptimisticLockException; import java.util.List; @@ -89,8 +90,8 @@ public PublishDatasetResult execute(CommandContext ctxt) throws CommandException } else { // major, non-first release - theDataset.getLatestVersion().setVersionNumber(new Long(theDataset.getVersionNumber() + 1)); - theDataset.getLatestVersion().setMinorVersionNumber(new Long(0)); + theDataset.getLatestVersion().setVersionNumber(theDataset.getVersionNumber() + 1L); + theDataset.getLatestVersion().setMinorVersionNumber(0L); } // Perform any optional validation steps, if defined: @@ -192,10 +193,12 @@ private void verifyCommandArguments(CommandContext ctxt) throws IllegalCommandEx if ( ! getUser().isAuthenticated() ) { throw new IllegalCommandException("Only authenticated users can release a Dataset. Please authenticate and try again.", this); } - - if (getDataset().getLatestVersion().getTermsOfUseAndAccess() == null - || (getDataset().getLatestVersion().getTermsOfUseAndAccess().getLicense() == null - && StringUtil.isEmpty(getDataset().getLatestVersion().getTermsOfUseAndAccess().getTermsOfUse()))) { + + var termsOfUseOrLicense = getDataset().getLatestVersion().getTermsOfUseOrLicense(); + if (termsOfUseOrLicense == null || ( + termsOfUseOrLicense.getLicense() == null + && StringUtil.isEmpty(termsOfUseOrLicense.getTermsOfUse()) + )) { throw new IllegalCommandException("Dataset must have a valid license or Custom Terms Of Use configured before it can be published.", this); } diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/RestrictFileCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/RestrictFileCommand.java index 2387e5fb31b..8f13587ce13 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/RestrictFileCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/RestrictFileCommand.java @@ -73,12 +73,12 @@ protected void executeImpl(CommandContext ctxt) throws CommandException { else { Dataset dataset = file.getOwner(); DatasetVersion workingVersion = dataset.getOrCreateEditVersion(); + if (workingVersion.getTermsOfAccess() == null) { + workingVersion.setTermsOfAccess(new TermsOfAccess()); + } if (restrict && fileAccessRequest != null) { - if (workingVersion.getTermsOfUseAndAccess() == null) { - workingVersion.setTermsOfUseAndAccess(new TermsOfUseAndAccess()); - } - workingVersion.getTermsOfUseAndAccess().setFileAccessRequest(fileAccessRequest); - workingVersion.getTermsOfUseAndAccess().setTermsOfAccess(termsOfAccess); + workingVersion.getTermsOfAccess().setFileAccessRequest(fileAccessRequest); + workingVersion.getTermsOfAccess().setTermsOfAccess(termsOfAccess); } // We need the FileMetadata for the file in the draft dataset version and the // file we have may still reference the fmd from the prior released version diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetFieldsCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetFieldsCommand.java index e52954eb4f8..9d96da87e0e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetFieldsCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetFieldsCommand.java @@ -36,7 +36,8 @@ public UpdateDatasetFieldsCommand(Dataset dataset, List updatedFie @Override public Dataset execute(CommandContext ctxt) throws CommandException { DatasetVersion datasetVersion = dataset.getOrCreateEditVersion(); - datasetVersion.getTermsOfUseAndAccess().setDatasetVersion(datasetVersion); + datasetVersion.getTermsOfUseOrLicense().setDatasetVersion(datasetVersion); + datasetVersion.getTermsOfAccess().setDatasetVersion(datasetVersion); String validationErrors = ctxt.datasetFieldsValidator().validateFields(updatedFields, datasetVersion); if (!validationErrors.isEmpty()) { diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetLicenseCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetLicenseCommand.java index 0d85dbb6f37..f649697842b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetLicenseCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetLicenseCommand.java @@ -2,7 +2,7 @@ import edu.harvard.iq.dataverse.Dataset; import edu.harvard.iq.dataverse.DatasetVersion; -import edu.harvard.iq.dataverse.TermsOfUseAndAccess; +import edu.harvard.iq.dataverse.TermsOfUseOrLicense; import edu.harvard.iq.dataverse.authorization.Permission; import edu.harvard.iq.dataverse.engine.command.*; import edu.harvard.iq.dataverse.engine.command.exception.CommandException; @@ -15,16 +15,16 @@ @RequiredPermissions(Permission.EditDataset) public class UpdateDatasetLicenseCommand extends AbstractDatasetCommand { private License license = null; - private TermsOfUseAndAccess customTermsOfUseAndAccess = null; + private TermsOfUseOrLicense customTermsOfUseOrLicense = null; public UpdateDatasetLicenseCommand(DataverseRequest aRequest, Dataset dataset, License license) { super(aRequest, dataset); this.license = license; } - public UpdateDatasetLicenseCommand(DataverseRequest aRequest, Dataset dataset, TermsOfUseAndAccess customTermsOfUseAndAccess) { + public UpdateDatasetLicenseCommand(DataverseRequest aRequest, Dataset dataset, TermsOfUseOrLicense customTermsOfUseOrLicense) { super(aRequest, dataset); - this.customTermsOfUseAndAccess = customTermsOfUseAndAccess; + this.customTermsOfUseOrLicense = customTermsOfUseOrLicense; } @@ -38,18 +38,18 @@ public Dataset execute(CommandContext ctxt) throws CommandException { if (!license.isActive()) { throw new InvalidCommandArgumentsException(BundleUtil.getStringFromBundle("updateDatasetLicenseCommand.errors.licenseNotActive", List.of(license.getName())), this); } - TermsOfUseAndAccess termsOfUseAndAccess = datasetVersion.getTermsOfUseAndAccess(); - termsOfUseAndAccess.setLicense(license); + TermsOfUseOrLicense termsOfUseOrLicense = datasetVersion.getTermsOfUseOrLicense(); + termsOfUseOrLicense.setLicense(license); savedDataset = ctxt.engine().submit(new UpdateDatasetVersionCommand(getDataset(), getRequest())); - } else if (customTermsOfUseAndAccess != null) { - if (customTermsOfUseAndAccess.getTermsOfUse() == null || customTermsOfUseAndAccess.getTermsOfUse().isBlank()) { + } else if (customTermsOfUseOrLicense != null) { + if (customTermsOfUseOrLicense.getTermsOfUse() == null || customTermsOfUseOrLicense.getTermsOfUse().isBlank()) { throw new InvalidCommandArgumentsException(BundleUtil.getStringFromBundle("updateDatasetLicenseCommand.errors.customTermsOfUseNotProvided"), this); } - TermsOfUseAndAccess termsToUpdate = datasetVersion.getTermsOfUseAndAccess(); - applyCustomTerms(termsToUpdate, customTermsOfUseAndAccess); + TermsOfUseOrLicense termsToUpdate = datasetVersion.getTermsOfUseOrLicense(); + applyCustomTerms(termsToUpdate, customTermsOfUseOrLicense); termsToUpdate.setLicense(null); - datasetVersion.setTermsOfUseAndAccess(termsToUpdate); + datasetVersion.setTermsOfUseOrLicense(termsToUpdate); savedDataset = ctxt.engine().submit(new UpdateDatasetVersionCommand(getDataset(), getRequest())); } return savedDataset; @@ -59,10 +59,10 @@ public Dataset execute(CommandContext ctxt) throws CommandException { * Copies all custom term-related fields from the 'source' object * to the 'target' object. * - * @param target The TermsOfUseAndAccess object to be modified - * @param source The TermsOfUseAndAccess object containing the new data + * @param target The TermsOfUseOrLicense object to be modified + * @param source The TermsOfUseOrLicense object containing the new data */ - private void applyCustomTerms(TermsOfUseAndAccess target, TermsOfUseAndAccess source) { + private void applyCustomTerms(TermsOfUseOrLicense target, TermsOfUseOrLicense source) { target.setTermsOfUse(source.getTermsOfUse()); target.setConfidentialityDeclaration(source.getConfidentialityDeclaration()); target.setSpecialPermissions(source.getSpecialPermissions()); diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetTermsOfAccessCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetTermsOfAccessCommand.java index 62833edfa46..a8445369e93 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetTermsOfAccessCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetTermsOfAccessCommand.java @@ -3,7 +3,8 @@ import edu.harvard.iq.dataverse.Dataset; import edu.harvard.iq.dataverse.DatasetVersion; -import edu.harvard.iq.dataverse.TermsOfUseAndAccess; +import edu.harvard.iq.dataverse.TermsOfAccess; +import edu.harvard.iq.dataverse.TermsOfUseOrLicense; import edu.harvard.iq.dataverse.authorization.Permission; import edu.harvard.iq.dataverse.engine.command.CommandContext; import edu.harvard.iq.dataverse.engine.command.DataverseRequest; @@ -20,18 +21,19 @@ public class UpdateDatasetTermsOfAccessCommand extends AbstractDatasetCommand{ private License license = null; - private TermsOfUseAndAccess customTermsOfUseAndAccess = null; + private TermsOfUseOrLicense customTermsOfUseOrLicense = null; private Template template; public UpdateTemplateLicenseCommand(DataverseRequest request, Template template, Dataverse dataverse, License license) { @@ -31,17 +31,17 @@ public UpdateTemplateLicenseCommand(DataverseRequest request, Template template, this.license = license; } - public UpdateTemplateLicenseCommand(DataverseRequest request, Template template, Dataverse dataverse, TermsOfUseAndAccess customTermsOfUseAndAccess) { + public UpdateTemplateLicenseCommand(DataverseRequest request, Template template, Dataverse dataverse, TermsOfUseOrLicense customTermsOfUseOrLicense) { super(request, dataverse); this.template = template; - this.customTermsOfUseAndAccess = customTermsOfUseAndAccess; + this.customTermsOfUseOrLicense = customTermsOfUseOrLicense; } @Override public Template execute(CommandContext ctxt) throws CommandException { Template savedTemplate; - if (license == null && customTermsOfUseAndAccess == null) { + if (license == null && customTermsOfUseOrLicense == null) { throw new InvalidCommandArgumentsException(BundleUtil.getStringFromBundle("updateDatasetLicenseCommand.errors.customTermsOfUseNotProvided"), this); } @@ -49,18 +49,18 @@ public Template execute(CommandContext ctxt) throws CommandException { if (!license.isActive()) { throw new InvalidCommandArgumentsException(BundleUtil.getStringFromBundle("updateDatasetLicenseCommand.errors.licenseNotActive", List.of(license.getName())), this); } - TermsOfUseAndAccess termsOfUseAndAccess = template.getTermsOfUseAndAccess(); + TermsOfUseOrLicense termsOfUseAndAccess = template.getTermsOfUseOrLicense(); termsOfUseAndAccess.setLicense(license); savedTemplate = ctxt.templates().save(template); } else { - if (customTermsOfUseAndAccess.getTermsOfUse() == null || customTermsOfUseAndAccess.getTermsOfUse().isBlank()) { + if (customTermsOfUseOrLicense.getTermsOfUse() == null || customTermsOfUseOrLicense.getTermsOfUse().isBlank()) { throw new InvalidCommandArgumentsException(BundleUtil.getStringFromBundle("updateDatasetLicenseCommand.errors.customTermsOfUseNotProvided"), this); } - TermsOfUseAndAccess termsToUpdate = template.getTermsOfUseAndAccess(); - applyCustomTerms(termsToUpdate, customTermsOfUseAndAccess); - template.setTermsOfUseAndAccess(termsToUpdate); - template.getTermsOfUseAndAccess().setLicense(null); + TermsOfUseOrLicense termsToUpdate = template.getTermsOfUseOrLicense(); + applyCustomTerms(termsToUpdate, customTermsOfUseOrLicense); + template.setTermsOfUseOrLicense(termsToUpdate); + template.getTermsOfUseOrLicense().setLicense(null); savedTemplate = ctxt.templates().save(template); } @@ -75,7 +75,7 @@ public Template execute(CommandContext ctxt) throws CommandException { * @param target The TermsOfUseAndAccess object to be modified * @param source The TermsOfUseAndAccess object containing the new data */ - private void applyCustomTerms(TermsOfUseAndAccess target, TermsOfUseAndAccess source) { + private void applyCustomTerms(TermsOfUseOrLicense target, TermsOfUseOrLicense source) { target.setTermsOfUse(source.getTermsOfUse()); target.setConfidentialityDeclaration(source.getConfidentialityDeclaration()); target.setSpecialPermissions(source.getSpecialPermissions()); diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateTemplateTermsOfAccessCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateTemplateTermsOfAccessCommand.java index cc07a150e5d..e6c23d6d091 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateTemplateTermsOfAccessCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateTemplateTermsOfAccessCommand.java @@ -2,7 +2,7 @@ import edu.harvard.iq.dataverse.Dataverse; import edu.harvard.iq.dataverse.Template; -import edu.harvard.iq.dataverse.TermsOfUseAndAccess; +import edu.harvard.iq.dataverse.TermsOfAccess; import edu.harvard.iq.dataverse.authorization.Permission; import edu.harvard.iq.dataverse.engine.command.AbstractCommand; import edu.harvard.iq.dataverse.engine.command.CommandContext; @@ -20,32 +20,32 @@ @RequiredPermissions(Permission.EditDataverse) public class UpdateTemplateTermsOfAccessCommand extends AbstractCommand