diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java index 2b4844e4d16..c45ddcd62cb 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java @@ -203,6 +203,9 @@ public enum VersionState { //The Json version of the archivalCopyLocation string @Transient private JsonObject archivalCopyLocationJson; + + @Transient + private Boolean hasFiles = null; public Long getId() { return this.id; @@ -2192,5 +2195,12 @@ public void setVersionNote(String note) { this.versionNote = note; } + + public Boolean hasFiles() { + return hasFiles; + } + public void setHasFiles(Boolean hasFiles) { + this.hasFiles = hasFiles; + } } diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java index dcc9995ef35..95443c35e05 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java @@ -1340,6 +1340,15 @@ public Long getDatasetVersionCount(Long datasetId, boolean canViewUnpublishedVer return em.createQuery(cq).getSingleResult(); } + public boolean hasFiles(Long datasetVersionId) { + Query query = em.createNativeQuery("SELECT id FROM fileMetadata WHERE datasetversion_id="+datasetVersionId+" LIMIT 1"); + try { + query.getSingleResult(); + return true; + } catch (NoResultException e) { + return false; + } + } /** * Update the archival copy location for a specific version of a dataset. diff --git a/src/main/java/edu/harvard/iq/dataverse/PermissionsWrapper.java b/src/main/java/edu/harvard/iq/dataverse/PermissionsWrapper.java index a833fd1858b..0af3816035a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/PermissionsWrapper.java +++ b/src/main/java/edu/harvard/iq/dataverse/PermissionsWrapper.java @@ -7,6 +7,7 @@ import edu.harvard.iq.dataverse.authorization.Permission; import edu.harvard.iq.dataverse.authorization.groups.impl.builtin.AuthenticatedUsers; +import edu.harvard.iq.dataverse.authorization.users.GuestUser; import edu.harvard.iq.dataverse.authorization.users.User; import edu.harvard.iq.dataverse.engine.command.Command; import edu.harvard.iq.dataverse.engine.command.DataverseRequest; @@ -33,6 +34,9 @@ public class PermissionsWrapper implements java.io.Serializable { @EJB PermissionServiceBean permissionService; + @EJB + DatasetVersionServiceBean datasetVersionService; + @Inject DataverseSession session; @@ -257,35 +261,42 @@ public boolean canIssueDeleteDatasetCommand(DvObject dvo){ // PUBLISH DATASET public boolean canIssuePublishDatasetCommand(DvObject dvo){ User u = session.getUser(); - if (u != null && u.isSuperuser()) { + if (dvo == null || u == null || u instanceof GuestUser || !(dvo instanceof Dataset)) { + return false; // guests can not publish + } + if (u.isSuperuser()) { return true; } // Return false if dataset has 0 files and user want to 'publish' or 'submit for review' and 'publish dataset requires files' flag is set - if (dvo.isInstanceofDataset()) { - Dataverse dv =((Dataset)dvo).getOwner(); - if (dv != null) { - List metadataList = ((Dataset) dvo).getLatestVersion().getFileMetadatas(); - if (metadataList.size() == 0 && dv.getEffectiveRequiresFilesToPublishDataset()) { - return false; - } - } + Dataset ds = (Dataset)dvo; + Dataverse dv = ds.getOwner(); + if (dv != null && !datasetVersionHasFiles(ds.getLatestVersion()) && dv.getEffectiveRequiresFilesToPublishDataset()) { + return false; } - return canIssueCommand(dvo, PublishDatasetCommand.class); + return canIssueCommand(ds, PublishDatasetCommand.class); } // SUBMIT DATASET FOR REVIEW - public boolean canIssueSubmitDatasetForReviewCommand(DvObject dvo){ + public boolean canIssueSubmitDatasetForReviewCommand(DvObject dvo) { + User u = session.getUser(); + if (dvo == null || u == null || u instanceof GuestUser || !(dvo instanceof Dataset)) { + return false; // guests can not submit for review + } // Return false if dataset has 0 files and user want to 'publish' or 'submit for review' and 'publish dataset requires files' flag is set - if (dvo.isInstanceofDataset()) { - Dataverse dv =((Dataset)dvo).getOwner(); - if (dv != null) { - List metadataList = ((Dataset) dvo).getLatestVersion().getFileMetadatas(); - if (metadataList.size() == 0 && dv.getEffectiveRequiresFilesToPublishDataset()) { - return false; - } - } + Dataset ds = (Dataset)dvo; + Dataverse dv = ds.getOwner(); + if (dv != null && !datasetVersionHasFiles(ds.getLatestVersion()) && dv.getEffectiveRequiresFilesToPublishDataset()) { + return false; + } + return canIssueCommand(ds, SubmitDatasetForReviewCommand.class); + } + + // cache the hasFiles in the ds version for performance reasons + private boolean datasetVersionHasFiles(DatasetVersion dsv) { + if (dsv.hasFiles() == null) { + dsv.setHasFiles(datasetVersionService.hasFiles(dsv.getId())); } - return canIssueCommand(dvo, SubmitDatasetForReviewCommand.class); + return dsv.hasFiles(); } // For the dataverse_header fragment (and therefore, most of the pages), diff --git a/src/main/java/edu/harvard/iq/dataverse/search/SearchIncludeFragment.java b/src/main/java/edu/harvard/iq/dataverse/search/SearchIncludeFragment.java index 2ebb1903655..e8ba7a917b0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/SearchIncludeFragment.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/SearchIncludeFragment.java @@ -1411,10 +1411,6 @@ public String dataFileSizeDisplay(DataFile datafile) { return datafile.getFriendlySize(); } - - public boolean canPublishDataset(Long datasetId){ - return permissionsWrapper.canIssuePublishDatasetCommand(dvObjectService.findDvObject(datasetId)); - } public void setDisplayCardValues() { @@ -1552,13 +1548,17 @@ public boolean isValid(SolrSearchResult result) { return true; }); } - - public boolean canSeeCurationStatus(Long datasetId) { - boolean creatorsCanSeeStatus = JvmSettings.UI_SHOW_CURATION_STATUS_TO_ALL.lookupOptional(Boolean.class).orElse(false); - if (creatorsCanSeeStatus) { - return permissionsWrapper.canViewUnpublishedDataset(getDataverseRequest(),(Dataset) dvObjectService.findDvObject(datasetId)); + + public boolean canSeeCurationStatus(DvObject dvo) { + if (dvo != null && dvo instanceof Dataset) { + boolean creatorsCanSeeStatus = JvmSettings.UI_SHOW_CURATION_STATUS_TO_ALL.lookupOptional(Boolean.class).orElse(false); + if (creatorsCanSeeStatus) { + return permissionsWrapper.canViewUnpublishedDataset(getDataverseRequest(), (Dataset)dvo); + } else { + return permissionsWrapper.canIssuePublishDatasetCommand(dvo); + } } else { - return canPublishDataset(datasetId); + return false; } } diff --git a/src/main/webapp/search-include-fragment.xhtml b/src/main/webapp/search-include-fragment.xhtml index 735b586e447..30186fe87f1 100644 --- a/src/main/webapp/search-include-fragment.xhtml +++ b/src/main/webapp/search-include-fragment.xhtml @@ -582,7 +582,7 @@ - +