diff --git a/.gitignore b/.gitignore index 2904bc578f2..ec135fb3618 100644 --- a/.gitignore +++ b/.gitignore @@ -60,3 +60,8 @@ scripts/installer/default.config tests/node_modules tests/package-lock.json venv + +# from thumbnail tests in SearchIT +scripts/search/data/binary/trees.png.thumb140 +src/main/webapp/resources/images/cc0.png.thumb140 +src/main/webapp/resources/images/dataverseproject.png.thumb140 diff --git a/doc/release-notes/6684-buttons b/doc/release-notes/6684-buttons new file mode 100644 index 00000000000..ad4233f6e80 --- /dev/null +++ b/doc/release-notes/6684-buttons @@ -0,0 +1 @@ +Note about how the buttons are the next steps towards the dataset and file redesign, mention previews on page, filtering/sorting options, tree view. \ No newline at end of file diff --git a/doc/sphinx-guides/source/api/dataaccess.rst b/doc/sphinx-guides/source/api/dataaccess.rst index 8a809e679d5..a3fbdfd73f4 100755 --- a/doc/sphinx-guides/source/api/dataaccess.rst +++ b/doc/sphinx-guides/source/api/dataaccess.rst @@ -58,8 +58,8 @@ the following parameter values are supported (for image and pdf files only): ============== =========== Value Description ============== =========== -true Generates a thumbnail image, by rescaling to the default thumbnail size (64 pixels) -``N`` Rescales the image to ``N`` pixels. +true Generates a thumbnail image by rescaling to the default thumbnail size (64 pixels wide). +``N`` Rescales the image to ``N`` pixels wide. ``imageThumb=true`` and ``imageThumb=64`` are equivalent. ============== =========== Multiple File ("bundle") download diff --git a/src/main/java/edu/harvard/iq/dataverse/Dataset.java b/src/main/java/edu/harvard/iq/dataverse/Dataset.java index 1930a915d12..5f1b0552d15 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Dataset.java +++ b/src/main/java/edu/harvard/iq/dataverse/Dataset.java @@ -845,8 +845,8 @@ public boolean isAncestorOf( DvObject other ) { return equals(other) || equals(other.getOwner()); } - public DatasetThumbnail getDatasetThumbnail() { - return DatasetUtil.getThumbnail(this); + public DatasetThumbnail getDatasetThumbnail(int size) { + return DatasetUtil.getThumbnail(this, size); } /** @@ -857,8 +857,8 @@ public DatasetThumbnail getDatasetThumbnail() { * @param datasetVersion * @return A thumbnail of the dataset (may be {@code null}). */ - public DatasetThumbnail getDatasetThumbnail(DatasetVersion datasetVersion) { - return DatasetUtil.getThumbnail(this, datasetVersion); + public DatasetThumbnail getDatasetThumbnail(DatasetVersion datasetVersion, int size) { + return DatasetUtil.getThumbnail(this, datasetVersion, size); } } diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java index 27d6bbdde5e..cba68fb1ff7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java @@ -375,7 +375,7 @@ public String getThumbnailString() { } if (!readOnly) { - DatasetThumbnail datasetThumbnail = dataset.getDatasetThumbnail(); + DatasetThumbnail datasetThumbnail = dataset.getDatasetThumbnail(ImageThumbConverter.DEFAULT_DATASETLOGO_SIZE); if (datasetThumbnail == null) { thumbnailString = ""; return null; @@ -391,7 +391,10 @@ public String getThumbnailString() { thumbnailString = datasetThumbnail.getBase64image(); } else { - thumbnailString = thumbnailServiceWrapper.getDatasetCardImageAsBase64Url(dataset, workingVersion.getId(),!workingVersion.isDraft()); + thumbnailString = thumbnailServiceWrapper.getDatasetCardImageAsBase64Url(dataset, + workingVersion.getId(), + !workingVersion.isDraft(), + ImageThumbConverter.DEFAULT_DATASETLOGO_SIZE); if (thumbnailString == null) { thumbnailString = ""; return null; @@ -1057,6 +1060,17 @@ public boolean canComputeAllFiles(boolean isCartCompute){ } return true; } + + public boolean canDownloadFiles(){ + //returns true if the page user has permission to download at least one file + for (FileMetadata fmd : workingVersion.getFileMetadatas()) { + if (fileDownloadHelper.canDownloadFile(fmd)) { + return true; + } + } + return false; + } + /* in getComputeUrl(), we are sending the container/dataset name and the exipiry and signature for the temporary url of only ONE datafile within the dataset. This is because in the @@ -1802,7 +1816,7 @@ private String init(boolean initFull) { String nonNullDefaultIfKeyNotFound = ""; protocol = settingsWrapper.getValueForKey(SettingsServiceBean.Key.Protocol, nonNullDefaultIfKeyNotFound); authority = settingsWrapper.getValueForKey(SettingsServiceBean.Key.Authority, nonNullDefaultIfKeyNotFound); - if (dataset.getId() != null || versionId != null || persistentId != null) { // view mode for a dataset + if (this.getId() != null || versionId != null || persistentId != null) { // view mode for a dataset DatasetVersionServiceBean.RetrieveDatasetVersionResponse retrieveDatasetVersionResponse = null; @@ -2418,22 +2432,6 @@ public void edit(EditMode editMode) { this.readOnly = false; } - public String releaseDraft() { - if (releaseRadio == 1) { - return releaseDataset(true); - } else if(releaseRadio ==2) { - return releaseDataset(false); - } else if(releaseRadio ==3) { - return updateCurrentVersion(); - } else { - return "Invalid Choice"; - } - } - - public String releaseMajor() { - return releaseDataset(false); - } - public String sendBackToContributor() { try { //FIXME - Get Return Comment from sendBackToContributor popup @@ -2484,7 +2482,22 @@ public String releaseParentDVAndDataset(){ } public String releaseDataset() { - return releaseDataset(false); + if(!dataset.getOwner().isReleased()){ + releaseParentDV(); + } + if(publishDatasetPopup()|| publishBothPopup() || !dataset.getLatestVersion().isMinorUpdate()){ + return releaseDataset(false); + } + switch (releaseRadio) { + case 1: + return releaseDataset(true); + case 2: + return releaseDataset(false); + case 3: + return updateCurrentVersion(); + default: + return "Invalid Choice"; + } } private void releaseParentDV(){ @@ -3764,17 +3777,95 @@ public boolean isLockedForAnyReason() { } return false; } + + public void processPublishButton() { + if (dataset.isReleased()) { + PrimeFaces.current().executeScript("PF('publishDataset').show()"); + } + + if (!dataset.isReleased()) { + if (dataset.getOwner().isReleased()) { + PrimeFaces.current().executeScript("PF('publishDataset').show()"); + return; + } + if (!dataset.getOwner().isReleased()) { + if (canPublishDataverse()) { + if (dataset.getOwner().getOwner() == null + || (dataset.getOwner().getOwner() != null && dataset.getOwner().getOwner().isReleased())) { + PrimeFaces.current().executeScript("PF('publishDataset').show()"); + return; + } + if ((dataset.getOwner().getOwner() != null && !dataset.getOwner().getOwner().isReleased())) { + PrimeFaces.current().executeScript("PF('maynotPublishParent').show()"); + } + + } else { + PrimeFaces.current().executeScript("PF('mayNotRelease').show()"); + } + } + } + } + public boolean releaseDraftPopup(){ + return dataset.isReleased(); + } + + public boolean publishDatasetPopup(){ + if (!dataset.isReleased()) { + return dataset.getOwner().isReleased(); + } + return false; + } + + public boolean publishBothPopup() { + if (!dataset.getOwner().isReleased()) { + if (canPublishDataverse()) { + if (dataset.getOwner().getOwner() == null + || (dataset.getOwner().getOwner() != null && dataset.getOwner().getOwner().isReleased())) { + return true; + } + } + } + return false; + } + + public String getPublishButtonLabel(){ + if(publishDatasetPopup() || releaseDraftPopup()){ + BundleUtil.getStringFromBundle("continue"); + } + if(publishBothPopup()){ + BundleUtil.getStringFromBundle("dataset.mayNotBePublished.both.button"); + } + return ""; + } + private Boolean lockedFromEditsVar; private Boolean lockedFromDownloadVar; private boolean lockedDueToDcmUpload; private Boolean lockedDueToIngestVar; + private Boolean lockedFromPublishingVar; + + /** + * Authors are not allowed to publish but curators are allowed - when Dataset is inReview + * For all other locks edit should be locked for all editors. + */ + public boolean isLockedFromPublishing() { + if (null == lockedFromPublishingVar || stateChanged) { + try { + permissionService.checkPublishDatasetLock(dataset, dvRequestService.getDataverseRequest(), new PublishDatasetCommand(dataset, dvRequestService.getDataverseRequest(), true)); + lockedFromPublishingVar = false; + } catch (IllegalCommandException ex) { + lockedFromPublishingVar = true; + } + } + return lockedFromPublishingVar; + } /** * Authors are not allowed to edit but curators are allowed - when Dataset is inReview * For all other locks edit should be locked for all editors. */ public boolean isLockedFromEdits() { - if(null == lockedFromEditsVar || stateChanged) { + if (null == lockedFromEditsVar || stateChanged) { try { permissionService.checkEditDatasetLock(dataset, dvRequestService.getDataverseRequest(), new UpdateDatasetVersionCommand(dataset, dvRequestService.getDataverseRequest())); lockedFromEditsVar = false; @@ -3783,6 +3874,7 @@ public boolean isLockedFromEdits() { } } return lockedFromEditsVar; + } /** @@ -4076,12 +4168,18 @@ private List resetReleasedVersionTabList() { } return retList; } + + public boolean isDisplayPublishPopupCustomText() { + if (dataset.isReleased()) { + return isDatasetPublishPopupCustomTextOnAllVersions() && !getDatasetPublishCustomText().isEmpty(); + } + return !getDatasetPublishCustomText().isEmpty(); + } public String getDatasetPublishCustomText(){ String datasetPublishCustomText = settingsWrapper.getValueForKey(SettingsServiceBean.Key.DatasetPublishPopupCustomText); if( datasetPublishCustomText!= null && !datasetPublishCustomText.isEmpty()){ - return datasetPublishCustomText; - + return datasetPublishCustomText; } return ""; } diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DatasetServiceBean.java index 6dbb39935fd..0853ee785bb 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetServiceBean.java @@ -726,7 +726,7 @@ public Dataset setNonDatasetFileAsThumbnail(Dataset dataset, InputStream inputSt logger.fine("In setNonDatasetFileAsThumbnail but inputStream is null! Returning null."); return null; } - dataset = DatasetUtil.persistDatasetLogoToStorageAndCreateThumbnail(dataset, inputStream); + dataset = DatasetUtil.persistDatasetLogoToStorageAndCreateThumbnails(dataset, inputStream); dataset.setThumbnailFile(null); return merge(dataset); } diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetWidgetsPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetWidgetsPage.java index 039ad4f6f27..9cc611e146a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetWidgetsPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetWidgetsPage.java @@ -67,8 +67,8 @@ public String init() { if (!permissionsWrapper.canIssueCommand(dataset, UpdateDatasetVersionCommand.class)) { return permissionsWrapper.notAuthorized(); } - datasetThumbnails = DatasetUtil.getThumbnailCandidates(dataset, considerDatasetLogoAsCandidate); - datasetThumbnail = dataset.getDatasetThumbnail(); + datasetThumbnails = DatasetUtil.getThumbnailCandidates(dataset, considerDatasetLogoAsCandidate, ImageThumbConverter.DEFAULT_DATASETLOGO_SIZE); + datasetThumbnail = dataset.getDatasetThumbnail(ImageThumbConverter.DEFAULT_DATASETLOGO_SIZE); if (datasetThumbnail != null) { DataFile dataFile = datasetThumbnail.getDataFile(); if (dataFile != null) { @@ -117,7 +117,7 @@ public void setDatasetFileThumbnailToSwitchTo(DataFile datasetFileThumbnailToSwi public void setDataFileAsThumbnail() { logger.fine("setDataFileAsThumbnail clicked"); updateDatasetThumbnailCommand = new UpdateDatasetThumbnailCommand(dvRequestService.getDataverseRequest(), dataset, UpdateDatasetThumbnailCommand.UserIntent.setDatasetFileAsThumbnail, datasetFileThumbnailToSwitchTo.getId(), null); - String base64image = ImageThumbConverter.getImageThumbnailAsBase64(datasetFileThumbnailToSwitchTo, ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE); + String base64image = ImageThumbConverter.getImageThumbnailAsBase64(datasetFileThumbnailToSwitchTo, ImageThumbConverter.DEFAULT_DATASETLOGO_SIZE); datasetThumbnail = new DatasetThumbnail(base64image, datasetFileThumbnailToSwitchTo); } @@ -146,7 +146,7 @@ public void handleImageFileUpload(FileUploadEvent event) { Logger.getLogger(DatasetWidgetsPage.class.getName()).log(Level.SEVERE, null, ex); return; } - String base64image = ImageThumbConverter.generateImageThumbnailFromFileAsBase64(file, ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE); + String base64image = ImageThumbConverter.generateImageThumbnailFromFileAsBase64(file, ImageThumbConverter.DEFAULT_DATASETLOGO_SIZE); if (base64image != null) { datasetThumbnail = new DatasetThumbnail(base64image, datasetFileThumbnailToSwitchTo); } else { diff --git a/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java b/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java index 4a7fcff0259..f8663087219 100644 --- a/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java @@ -2512,7 +2512,7 @@ public void deleteDatasetLogoAndUseThisDataFileAsThumbnailInstead() { } public boolean isThumbnailIsFromDatasetLogoRatherThanDatafile() { - DatasetThumbnail datasetThumbnail = dataset.getDatasetThumbnail(); + DatasetThumbnail datasetThumbnail = dataset.getDatasetThumbnail(ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE); return datasetThumbnail != null && !datasetThumbnail.isFromDataFile(); } diff --git a/src/main/java/edu/harvard/iq/dataverse/PermissionServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/PermissionServiceBean.java index 33b941ff9b7..bef27ec49b6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/PermissionServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/PermissionServiceBean.java @@ -708,28 +708,62 @@ public List getDvObjectIdsUserHasRoleOn(User user, List rol public void checkEditDatasetLock(Dataset dataset, DataverseRequest dataverseRequest, Command command) throws IllegalCommandException { if (dataset.isLocked()) { + if (dataset.isLockedFor(DatasetLock.Reason.Ingest)) { + throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.message.locked.editNotAllowed"), command); + } + if (dataset.isLockedFor(DatasetLock.Reason.finalizePublication)) { + throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.message.locked.editNotAllowed"), command); + } + // TODO: Do we need to check for "Workflow"? Should the message be more specific? + if (dataset.isLockedFor(DatasetLock.Reason.Workflow)) { + throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.message.locked.editNotAllowed"), command); + } + // TODO: Do we need to check for "DcmUpload"? Should the message be more specific? + if (dataset.isLockedFor(DatasetLock.Reason.DcmUpload)) { + throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.message.locked.editNotAllowed"), command); + } + if (dataset.isLockedFor(DatasetLock.Reason.EditInProgress)) { + throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.message.locked.editNotAllowed"), command); + } if (dataset.isLockedFor(DatasetLock.Reason.InReview)) { // The "InReview" lock is not really a lock for curators. They can still make edits. if (!isUserAllowedOn(dataverseRequest.getUser(), new PublishDatasetCommand(dataset, dataverseRequest, true), dataset)) { throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.message.locked.editNotAllowedInReview"), command); } + } else { + //catch all for locked for any other reason + throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.message.locked.editNotAllowed"), command); } + } + } + + public void checkPublishDatasetLock(Dataset dataset, DataverseRequest dataverseRequest, Command command) throws IllegalCommandException { + if (dataset.isLocked()) { if (dataset.isLockedFor(DatasetLock.Reason.Ingest)) { - throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.message.locked.editNotAllowed"), command); + throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.message.locked.publishNotAllowed"), command); } if (dataset.isLockedFor(DatasetLock.Reason.finalizePublication)) { - throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.message.locked.editNotAllowed"), command); + throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.message.locked.publishNotAllowed"), command); } // TODO: Do we need to check for "Workflow"? Should the message be more specific? if (dataset.isLockedFor(DatasetLock.Reason.Workflow)) { - throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.message.locked.editNotAllowed"), command); + throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.message.locked.publishNotAllowed"), command); } // TODO: Do we need to check for "DcmUpload"? Should the message be more specific? if (dataset.isLockedFor(DatasetLock.Reason.DcmUpload)) { - throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.message.locked.editNotAllowed"), command); + throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.message.locked.publishNotAllowed"), command); } if (dataset.isLockedFor(DatasetLock.Reason.EditInProgress)) { - throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.message.locked.editNotAllowed"), command); + throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.message.locked.publishNotAllowed"), command); + } + if (dataset.isLockedFor(DatasetLock.Reason.InReview)) { + // The "InReview" lock is not really a lock for curators. They can still publish + if (!isUserAllowedOn(dataverseRequest.getUser(), new PublishDatasetCommand(dataset, dataverseRequest, true), dataset)) { + throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.message.locked.publishNotAllowed"), command); + } + } else { + //catch all for locked for some other reason + throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.message.locked.publishNotAllowed"), command); } } } diff --git a/src/main/java/edu/harvard/iq/dataverse/ThumbnailServiceWrapper.java b/src/main/java/edu/harvard/iq/dataverse/ThumbnailServiceWrapper.java index 51d803c5e02..6c8db8c124b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ThumbnailServiceWrapper.java +++ b/src/main/java/edu/harvard/iq/dataverse/ThumbnailServiceWrapper.java @@ -10,7 +10,6 @@ import edu.harvard.iq.dataverse.dataaccess.ImageThumbConverter; import edu.harvard.iq.dataverse.dataset.DatasetUtil; import static edu.harvard.iq.dataverse.dataset.DatasetUtil.datasetLogoThumbnail; -import static edu.harvard.iq.dataverse.dataset.DatasetUtil.thumb48addedByImageThumbConverter; import edu.harvard.iq.dataverse.search.SolrSearchResult; import edu.harvard.iq.dataverse.util.FileUtil; import java.io.File; @@ -51,7 +50,7 @@ public class ThumbnailServiceWrapper implements java.io.Serializable { private Map dvobjectThumbnailsMap = new HashMap<>(); private Map dvobjectViewMap = new HashMap<>(); - private String getAssignedDatasetImage(Dataset dataset) { + private String getAssignedDatasetImage(Dataset dataset, int size) { if (dataset == null) { return null; } @@ -70,9 +69,9 @@ private String getAssignedDatasetImage(Dataset dataset) { return null; } - String imageSourceBase64 = ImageThumbConverter.getImageThumbnailAsBase64( - assignedThumbnailFile, - ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE); + String imageSourceBase64 = ImageThumbConverter.getImageThumbnailAsBase64(assignedThumbnailFile, + size); + //ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE); if (imageSourceBase64 != null) { this.dvobjectThumbnailsMap.put(assignedThumbnailFileId, imageSourceBase64); @@ -183,9 +182,10 @@ public String getDatasetCardImageAsBase64Url(SolrSearchResult result) { Long versionId = result.getDatasetVersionId(); - return getDatasetCardImageAsBase64Url(dataset, versionId, result.isPublishedState()); + return getDatasetCardImageAsBase64Url(dataset, versionId, result.isPublishedState(), ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE); } - public String getDatasetCardImageAsBase64Url(Dataset dataset, Long versionId, boolean autoselect) { + + public String getDatasetCardImageAsBase64Url(Dataset dataset, Long versionId, boolean autoselect, int size) { Long datasetId = dataset.getId(); if (datasetId != null) { if (this.dvobjectThumbnailsMap.containsKey(datasetId)) { @@ -222,7 +222,8 @@ public String getDatasetCardImageAsBase64Url(Dataset dataset, Long versionId, bo // an auxilary file on the dataset level: // (don't bother checking if it exists; just try to open the input stream) try { - in = dataAccess.getAuxFileAsInputStream(datasetLogoThumbnail + thumb48addedByImageThumbConverter); + in = dataAccess.getAuxFileAsInputStream(datasetLogoThumbnail + ".thumb" + size); + //thumb48addedByImageThumbConverter); } catch (Exception ioex) { //ignore } @@ -248,7 +249,7 @@ public String getDatasetCardImageAsBase64Url(Dataset dataset, Long versionId, bo // If not, see if the dataset has one of its image files already assigned // to be the designated thumbnail: - cardImageUrl = this.getAssignedDatasetImage(dataset); + cardImageUrl = this.getAssignedDatasetImage(dataset, size); if (cardImageUrl != null) { //logger.info("dataset id " + result.getEntity().getId() + " has a dedicated image assigned; returning " + cardImageUrl); @@ -297,7 +298,8 @@ public String getDatasetCardImageAsBase64Url(Dataset dataset, Long versionId, bo if (dataFileService.isThumbnailAvailable(thumbnailImageFile)) { cardImageUrl = ImageThumbConverter.getImageThumbnailAsBase64( thumbnailImageFile, - ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE); + size); + //ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE); } if (cardImageUrl != null) { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Admin.java b/src/main/java/edu/harvard/iq/dataverse/api/Admin.java index 037d6953798..9eb5989962c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Admin.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Admin.java @@ -76,6 +76,7 @@ import edu.harvard.iq.dataverse.authorization.UserRecordIdentifier; import edu.harvard.iq.dataverse.authorization.groups.impl.explicit.ExplicitGroupServiceBean; import edu.harvard.iq.dataverse.authorization.users.User; +import edu.harvard.iq.dataverse.dataaccess.ImageThumbConverter; import edu.harvard.iq.dataverse.dataset.DatasetThumbnail; import edu.harvard.iq.dataverse.dataset.DatasetUtil; import edu.harvard.iq.dataverse.engine.command.DataverseRequest; @@ -1281,9 +1282,9 @@ public Response getDatasetThumbnailMetadata(@PathParam("id") Long idSupplied) { return error(Response.Status.NOT_FOUND, "Could not find dataset based on id supplied: " + idSupplied + "."); } JsonObjectBuilder data = Json.createObjectBuilder(); - DatasetThumbnail datasetThumbnail = dataset.getDatasetThumbnail(); + DatasetThumbnail datasetThumbnail = dataset.getDatasetThumbnail(ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE); data.add("isUseGenericThumbnail", dataset.isUseGenericThumbnail()); - data.add("datasetLogoPresent", DatasetUtil.isDatasetLogoPresent(dataset)); + data.add("datasetLogoPresent", DatasetUtil.isDatasetLogoPresent(dataset, ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE)); if (datasetThumbnail != null) { data.add("datasetThumbnailBase64image", datasetThumbnail.getBase64image()); DataFile dataFile = datasetThumbnail.getDataFile(); 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 f93f5c7e171..628db853e5c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -82,6 +82,7 @@ import edu.harvard.iq.dataverse.api.dto.RoleAssignmentDTO; import edu.harvard.iq.dataverse.batch.util.LoggingUtil; import edu.harvard.iq.dataverse.dataaccess.DataAccess; +import edu.harvard.iq.dataverse.dataaccess.ImageThumbConverter; import edu.harvard.iq.dataverse.dataaccess.S3AccessIO; import edu.harvard.iq.dataverse.engine.command.exception.CommandException; import edu.harvard.iq.dataverse.engine.command.exception.UnforcedCommandException; @@ -1218,7 +1219,7 @@ public Response getDatasetThumbnailCandidates(@PathParam("id") String idSupplied } JsonArrayBuilder data = Json.createArrayBuilder(); boolean considerDatasetLogoAsCandidate = true; - for (DatasetThumbnail datasetThumbnail : DatasetUtil.getThumbnailCandidates(dataset, considerDatasetLogoAsCandidate)) { + for (DatasetThumbnail datasetThumbnail : DatasetUtil.getThumbnailCandidates(dataset, considerDatasetLogoAsCandidate, ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE)) { JsonObjectBuilder candidate = Json.createObjectBuilder(); String base64image = datasetThumbnail.getBase64image(); if (base64image != null) { @@ -1243,7 +1244,7 @@ public Response getDatasetThumbnailCandidates(@PathParam("id") String idSupplied public Response getDatasetThumbnail(@PathParam("id") String idSupplied) { try { Dataset dataset = findDatasetOrDie(idSupplied); - InputStream is = DatasetUtil.getThumbnailAsInputStream(dataset); + InputStream is = DatasetUtil.getThumbnailAsInputStream(dataset, ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE); if(is == null) { return notFound("Thumbnail not available"); } diff --git a/src/main/java/edu/harvard/iq/dataverse/dataaccess/ImageThumbConverter.java b/src/main/java/edu/harvard/iq/dataverse/dataaccess/ImageThumbConverter.java index 81b10567a78..1249e95494e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/dataaccess/ImageThumbConverter.java +++ b/src/main/java/edu/harvard/iq/dataverse/dataaccess/ImageThumbConverter.java @@ -63,6 +63,7 @@ public class ImageThumbConverter { public static int DEFAULT_CARDIMAGE_SIZE = 48; public static int DEFAULT_THUMBNAIL_SIZE = 64; + public static int DEFAULT_DATASETLOGO_SIZE = 140; public static int DEFAULT_PREVIEW_SIZE = 400; private static final Logger logger = Logger.getLogger(ImageThumbConverter.class.getCanonicalName()); diff --git a/src/main/java/edu/harvard/iq/dataverse/dataset/DatasetUtil.java b/src/main/java/edu/harvard/iq/dataverse/dataset/DatasetUtil.java index a5931da26f4..f6de6b0c3f5 100644 --- a/src/main/java/edu/harvard/iq/dataverse/dataset/DatasetUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/dataset/DatasetUtil.java @@ -32,15 +32,17 @@ import javax.imageio.ImageIO; import org.apache.commons.io.IOUtils; import static edu.harvard.iq.dataverse.dataaccess.DataAccess.getStorageIO; +import static edu.harvard.iq.dataverse.dataaccess.DataAccess.getStorageIO; +import static edu.harvard.iq.dataverse.dataaccess.DataAccess.getStorageIO; public class DatasetUtil { private static final Logger logger = Logger.getLogger(DatasetUtil.class.getCanonicalName()); public static String datasetLogoFilenameFinal = "dataset_logo_original"; public static String datasetLogoThumbnail = "dataset_logo"; - public static String thumb48addedByImageThumbConverter = ".thumb48"; + public static String thumbExtension = ".thumb"; - public static List getThumbnailCandidates(Dataset dataset, boolean considerDatasetLogoAsCandidate) { + public static List getThumbnailCandidates(Dataset dataset, boolean considerDatasetLogoAsCandidate, int size) { List thumbnails = new ArrayList<>(); if (dataset == null) { return thumbnails; @@ -62,7 +64,7 @@ public static List getThumbnailCandidates(Dataset dataset, boo InputStream in = null; try { - in = dataAccess.getAuxFileAsInputStream(datasetLogoThumbnail + thumb48addedByImageThumbConverter); + in = dataAccess.getAuxFileAsInputStream(datasetLogoThumbnail + thumbExtension + size); } catch (Exception ioex) { } @@ -88,7 +90,7 @@ public static List getThumbnailCandidates(Dataset dataset, boo && ImageThumbConverter.isThumbnailAvailable(dataFile) && !dataFile.isRestricted()) { String imageSourceBase64 = null; - imageSourceBase64 = ImageThumbConverter.getImageThumbnailAsBase64(dataFile, ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE); + imageSourceBase64 = ImageThumbConverter.getImageThumbnailAsBase64(dataFile, size); if (imageSourceBase64 != null) { DatasetThumbnail datasetThumbnail = new DatasetThumbnail(imageSourceBase64, dataFile); @@ -107,7 +109,7 @@ public static List getThumbnailCandidates(Dataset dataset, boo * @param datasetVersion * @return */ - public static DatasetThumbnail getThumbnail(Dataset dataset, DatasetVersion datasetVersion) { + public static DatasetThumbnail getThumbnail(Dataset dataset, DatasetVersion datasetVersion, int size) { if (dataset == null) { return null; } @@ -125,10 +127,11 @@ public static DatasetThumbnail getThumbnail(Dataset dataset, DatasetVersion data try { if (dataAccess == null) { logger.warning("getThumbnail(): Failed to initialize dataset StorageIO for " + dataset.getStorageIdentifier()); - } else if (dataAccess.getAuxFileAsInputStream(datasetLogoThumbnail + thumb48addedByImageThumbConverter) != null) { - in = dataAccess.getAuxFileAsInputStream(datasetLogoThumbnail + thumb48addedByImageThumbConverter); + } else { + in = dataAccess.getAuxFileAsInputStream(datasetLogoThumbnail + ".thumb" + size); } } catch (IOException ex) { + in = null; logger.fine("Dataset-level thumbnail file does not exist, or failed to open; will try to find an image file that can be used as the thumbnail."); } @@ -160,7 +163,7 @@ public static DatasetThumbnail getThumbnail(Dataset dataset, DatasetVersion data logger.fine("Dataset (id :" + dataset.getId() + ") does not have a thumbnail available that could be selected automatically."); return null; } else { - String imageSourceBase64 = ImageThumbConverter.getImageThumbnailAsBase64(thumbnailFile, ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE); + String imageSourceBase64 = ImageThumbConverter.getImageThumbnailAsBase64(thumbnailFile, size); DatasetThumbnail defaultDatasetThumbnail = new DatasetThumbnail(imageSourceBase64, thumbnailFile); logger.fine("thumbnailFile (id :" + thumbnailFile.getId() + ") will get thumbnail through automatic selection from DataFile id " + thumbnailFile.getId()); return defaultDatasetThumbnail; @@ -170,7 +173,7 @@ public static DatasetThumbnail getThumbnail(Dataset dataset, DatasetVersion data logger.fine("Dataset (id :" + dataset.getId() + ") has a thumbnail the user selected but the file must have later been restricted. Returning null."); return null; } else { - String imageSourceBase64 = ImageThumbConverter.getImageThumbnailAsBase64(thumbnailFile, ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE); + String imageSourceBase64 = ImageThumbConverter.getImageThumbnailAsBase64(thumbnailFile, size); DatasetThumbnail userSpecifiedDatasetThumbnail = new DatasetThumbnail(imageSourceBase64, thumbnailFile); logger.fine("Dataset (id :" + dataset.getId() + ") will get thumbnail the user specified from DataFile id " + thumbnailFile.getId()); return userSpecifiedDatasetThumbnail; @@ -179,11 +182,11 @@ public static DatasetThumbnail getThumbnail(Dataset dataset, DatasetVersion data } } - public static DatasetThumbnail getThumbnail(Dataset dataset) { + public static DatasetThumbnail getThumbnail(Dataset dataset, int size) { if (dataset == null) { return null; } - return getThumbnail(dataset, null); + return getThumbnail(dataset, null, size); } public static boolean deleteDatasetLogo(Dataset dataset) { @@ -199,7 +202,8 @@ public static boolean deleteDatasetLogo(Dataset dataset) { } storageIO.deleteAuxObject(datasetLogoFilenameFinal); - storageIO.deleteAuxObject(datasetLogoThumbnail + thumb48addedByImageThumbConverter); + storageIO.deleteAuxObject(datasetLogoThumbnail + thumbExtension + ImageThumbConverter.DEFAULT_DATASETLOGO_SIZE); + storageIO.deleteAuxObject(datasetLogoThumbnail + thumbExtension + ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE); } catch (IOException ex) { logger.info("Failed to delete dataset logo: " + ex.getMessage()); @@ -252,7 +256,7 @@ public static DataFile attemptToAutomaticallySelectThumbnailFromDataFiles(Datase for (FileMetadata fmd : datasetVersion.getFileMetadatas()) { DataFile testFile = fmd.getDataFile(); // We don't want to use a restricted image file as the dedicated thumbnail: - if (!testFile.isRestricted() && FileUtil.isThumbnailSupported(testFile) && ImageThumbConverter.isThumbnailAvailable(testFile, ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE)) { + if (!testFile.isRestricted() && FileUtil.isThumbnailSupported(testFile) && ImageThumbConverter.isThumbnailAvailable(testFile, ImageThumbConverter.DEFAULT_DATASETLOGO_SIZE)) { return testFile; } } @@ -260,7 +264,7 @@ public static DataFile attemptToAutomaticallySelectThumbnailFromDataFiles(Datase return null; } - public static Dataset persistDatasetLogoToStorageAndCreateThumbnail(Dataset dataset, InputStream inputStream) { + public static Dataset persistDatasetLogoToStorageAndCreateThumbnails(Dataset dataset, InputStream inputStream) { if (dataset == null) { return null; } @@ -329,15 +333,28 @@ public static Dataset persistDatasetLogoToStorageAndCreateThumbnail(Dataset data logger.severe(ex.getMessage()); return null; } - String thumbFileLocation = ImageThumbConverter.rescaleImage(fullSizeImage, width, height, ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE, tmpFileForResize.toPath().toString()); + // We'll try to pre-generate the rescaled versions in both the + // DEFAULT_DATASET_LOGO (currently 140) and DEFAULT_CARDIMAGE_SIZE (48) + String thumbFileLocation = ImageThumbConverter.rescaleImage(fullSizeImage, width, height, ImageThumbConverter.DEFAULT_DATASETLOGO_SIZE, tmpFileForResize.toPath().toString()); + logger.fine("thumbFileLocation = " + thumbFileLocation); + logger.fine("tmpFileLocation=" + tmpFileForResize.toPath().toString()); + //now we must save the updated thumbnail + try { + dataAccess.savePathAsAux(Paths.get(thumbFileLocation), datasetLogoThumbnail+thumbExtension+ImageThumbConverter.DEFAULT_DATASETLOGO_SIZE); + } catch (IOException ex) { + logger.severe("Failed to move updated thumbnail file from " + tmpFile.getAbsolutePath() + " to its DataAccess location" + ": " + ex); + } + + thumbFileLocation = ImageThumbConverter.rescaleImage(fullSizeImage, width, height, ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE, tmpFileForResize.toPath().toString()); logger.fine("thumbFileLocation = " + thumbFileLocation); logger.fine("tmpFileLocation=" + tmpFileForResize.toPath().toString()); //now we must save the updated thumbnail try { - dataAccess.savePathAsAux(Paths.get(thumbFileLocation), datasetLogoThumbnail+thumb48addedByImageThumbConverter); + dataAccess.savePathAsAux(Paths.get(thumbFileLocation), datasetLogoThumbnail+thumbExtension+ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE); } catch (IOException ex) { logger.severe("Failed to move updated thumbnail file from " + tmpFile.getAbsolutePath() + " to its DataAccess location" + ": " + ex); } + //This deletes the tempfiles created for rescaling and encoding boolean tmpFileWasDeleted = tmpFile.delete(); boolean originalTempFileWasDeleted = tmpFileForResize.delete(); @@ -351,11 +368,11 @@ public static Dataset persistDatasetLogoToStorageAndCreateThumbnail(Dataset data return dataset; } - public static InputStream getThumbnailAsInputStream(Dataset dataset) { + public static InputStream getThumbnailAsInputStream(Dataset dataset, int size) { if (dataset == null) { return null; } - DatasetThumbnail datasetThumbnail = dataset.getDatasetThumbnail(); + DatasetThumbnail datasetThumbnail = dataset.getDatasetThumbnail(size); if (datasetThumbnail == null) { return null; } else { @@ -382,7 +399,7 @@ public static InputStream getThumbnailAsInputStream(Dataset dataset) { * file that is uploaded. Rather, we delete it after first creating at least * one thumbnail from it. */ - public static boolean isDatasetLogoPresent(Dataset dataset) { + public static boolean isDatasetLogoPresent(Dataset dataset, int size) { if (dataset == null) { return false; } @@ -391,7 +408,7 @@ public static boolean isDatasetLogoPresent(Dataset dataset) { try { dataAccess = DataAccess.getStorageIO(dataset); - return dataAccess.isAuxObjectCached(datasetLogoThumbnail + thumb48addedByImageThumbConverter); + return dataAccess.isAuxObjectCached(datasetLogoThumbnail + thumbExtension + size); } catch (IOException ioex) { } return false; diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetThumbnailCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetThumbnailCommand.java index ccb276a8b98..3f4b3c36b70 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetThumbnailCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetThumbnailCommand.java @@ -3,6 +3,7 @@ import edu.harvard.iq.dataverse.DataFile; import edu.harvard.iq.dataverse.Dataset; import edu.harvard.iq.dataverse.authorization.Permission; +import edu.harvard.iq.dataverse.dataaccess.ImageThumbConverter; import edu.harvard.iq.dataverse.dataset.DatasetThumbnail; import edu.harvard.iq.dataverse.engine.command.AbstractCommand; import edu.harvard.iq.dataverse.engine.command.CommandContext; @@ -71,7 +72,7 @@ public DatasetThumbnail execute(CommandContext ctxt) throws CommandException { throw new CommandException("Could not find file based on id supplied: " + dataFileIdSupplied + ".", this); } Dataset ds1 = ctxt.datasets().setDatasetFileAsThumbnail(dataset, datasetFileThumbnailToSwitchTo); - DatasetThumbnail datasetThumbnail = ds1.getDatasetThumbnail(); + DatasetThumbnail datasetThumbnail = ds1.getDatasetThumbnail(ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE); if (datasetThumbnail != null) { DataFile dataFile = datasetThumbnail.getDataFile(); if (dataFile != null) { @@ -108,14 +109,14 @@ public DatasetThumbnail execute(CommandContext ctxt) throws CommandException { Dataset datasetWithNewThumbnail = ctxt.datasets().setNonDatasetFileAsThumbnail(dataset, fileAsStream); IOUtils.closeQuietly(fileAsStream); if (datasetWithNewThumbnail != null) { - return datasetWithNewThumbnail.getDatasetThumbnail(); + return datasetWithNewThumbnail.getDatasetThumbnail(ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE); } else { return null; } case removeThumbnail: Dataset ds2 = ctxt.datasets().removeDatasetThumbnail(dataset); - DatasetThumbnail datasetThumbnail2 = ds2.getDatasetThumbnail(); + DatasetThumbnail datasetThumbnail2 = ds2.getDatasetThumbnail(ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE); if (datasetThumbnail2 == null) { return null; } else { diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index 38becbd841c..86c82c4c6ad 100755 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -743,17 +743,11 @@ dataverse.publish.header=Publish Dataverse dataverse.nopublished=No Published Dataverses dataverse.nopublished.tip=In order to use this feature you must have at least one published dataverse. dataverse.contact=Email Dataverse Contact -dataset.link=Link Dataset dataverse.link=Link Dataverse dataverse.link.btn.tip=Link to Your Dataverse dataverse.link.yourDataverses=Your Dataverse dataverse.link.yourDataverses.inputPlaceholder=Enter Dataverse Name dataverse.link.save=Save Linked Dataverse -dataset.link.save=Save Linked Dataset -dataset.link.not.to.owner=Can't link a dataset to its dataverse -dataset.link.not.to.parent.dataverse=Can't link a dataset to its parent dataverses -dataset.link.not.published=Can't link a dataset that has not been published -dataset.link.not.available=Can't link a dataset that has not been published or is not harvested dataverse.link.dataverse.choose=Choose which of your dataverses you would like to link this dataverse to. dataverse.link.dataset.choose=Enter the name of the dataverse you would like to link this dataset to. If you need to remove this link in the future, please contact {0}. dataverse.link.dataset.none=No linkable dataverses available. @@ -1220,7 +1214,18 @@ dataset.guestbookResponse.guestbook.responseTooLong=Please limit response to 255 # dataset.xhtml dataset.configureBtn=Configure dataset.pageTitle=Add New Dataset -dataset.editBtn=Edit + +dataset.accessBtn=Access Dataset +dataset.accessBtn.header.download=Download Options +dataset.accessBtn.header.explore=Explore Options +dataset.accessBtn.header.compute=Compute Options +dataset.linkBtn=Link Dataset +dataset.contactBtn=Contact Owner +dataset.shareBtn=Share + +dataset.publishBtn=Publish Dataset +dataset.editBtn=Edit Dataset + dataset.editBtn.itemLabel.upload=Files (Upload) dataset.editBtn.itemLabel.metadata=Metadata dataset.editBtn.itemLabel.terms=Terms @@ -1295,7 +1300,13 @@ dataset.mayNotPublish.twoGenerations= This dataset cannot be published until {0} dataset.mayNotBePublished.both.button=Yes, Publish Both dataset.viewVersion.unpublished=View Unpublished Version dataset.viewVersion.published=View Published Version -dataset.email.datasetContactBtn=Email Dataset Contact +dataset.link.title=Link Dataset +dataset.link.save=Save Linked Dataset +dataset.link.not.to.owner=Can't link a dataset to its dataverse +dataset.link.not.to.parent.dataverse=Can't link a dataset to its parent dataverses +dataset.link.not.published=Can't link a dataset that has not been published +dataset.link.not.available=Can't link a dataset that has not been published or is not harvested +dataset.email.datasetContactTitle=Contact Dataset Owner dataset.email.hiddenMessage= dataset.email.messageSubject=Test Message Subject dataset.email.datasetLinkBtn.tip=Link Dataset to Your Dataverse @@ -1366,6 +1377,7 @@ dataset.message.locked.editNotAllowedInReview=Dataset cannot be edited due to In dataset.message.locked.downloadNotAllowedInReview=Dataset file(s) may not be downloaded due to In Review dataset lock. dataset.message.locked.downloadNotAllowed=Dataset file(s) may not be downloaded due to dataset lock. dataset.message.locked.editNotAllowed=Dataset cannot be edited due to dataset lock. +dataset.message.locked.publishNotAllowed=Dataset cannot be published due to dataset lock. dataset.message.createSuccess=This dataset has been created dataset.message.createSuccess.failedToSaveFiles=Partial Success: The dataset has been created. But the file(s) could not be saved. Please try uploading the file(s) again. dataset.message.createSuccess.partialSuccessSavingFiles=Partial Success: The dataset has been created. But only {0} out of {1} files have been saved. Please try uploading the missing file(s) again. @@ -1468,6 +1480,15 @@ file.replace.original=Original File file.editFiles=Edit Files file.editFilesSelected=Edit file.editFile=Edit + +file.accessBtn=Access File +file.accessBtn.header.download=Download Options +file.editBtn=Edit File +file.contactBtn=Contact Owner +file.shareBtn=Share +file.share.title=Share File +file.share.tip=Share this file on your favorite social media networks. +file.share.text=View this file. file.bulkUpdate=Bulk Update file.uploadFiles=Upload Files file.replaceFile=Replace File diff --git a/src/main/webapp/dataset-citation.xhtml b/src/main/webapp/dataset-citation.xhtml index 7d3c582448a..f2a4be3f905 100644 --- a/src/main/webapp/dataset-citation.xhtml +++ b/src/main/webapp/dataset-citation.xhtml @@ -1,51 +1,55 @@ - -
-
-
-
- - - - - - + xmlns:h="http://java.sun.com/jsf/html" + xmlns:f="http://java.sun.com/jsf/core" + xmlns:ui="http://java.sun.com/jsf/facelets" + xmlns:c="http://java.sun.com/jsp/jstl/core" + xmlns:p="http://primefaces.org/ui" + xmlns:o="http://omnifaces.org/ui" + xmlns:jsf="http://xmlns.jcp.org/jsf"> +
+
+
+
+ #{DatasetPage.datasetVersionUI.title.value} +
- +
+ -
+
diff --git a/src/main/webapp/dataset-widgets.xhtml b/src/main/webapp/dataset-widgets.xhtml index 34fae0ea0a6..52a833eb70d 100644 --- a/src/main/webapp/dataset-widgets.xhtml +++ b/src/main/webapp/dataset-widgets.xhtml @@ -38,13 +38,14 @@

-
-

- - #{bundle['dataset.thumbnailsAndWidget.thumbnailImage.alt']} -

- #{bundle['dataset.thumbnailsAndWidget.thumbnailImage.default']} +
+ +
#{bundle['dataset.thumbnailsAndWidget.thumbnailImage.default']}
+ + #{bundle['dataset.thumbnailsAndWidget.thumbnailImage.alt']} + +
- -
@@ -112,7 +111,6 @@

-

@@ -145,51 +143,48 @@

- - -

- #{bundle['dataset.thumbnailsAndWidget.removeThumbnail.tip']} -

-
- - -
-
- -
-
-

#{bundle['dataset.thumbnailsAndWidget.availableThumbnails.tip']}

- - - - - -
- - -
#{thumbnail.filename}
- -
-
-
-
-
-
-
- - + +

+ #{bundle['dataset.thumbnailsAndWidget.removeThumbnail.tip']} +

+
+ + +
+
+ +
+
+

#{bundle['dataset.thumbnailsAndWidget.availableThumbnails.tip']}

+ + + + + +
+ + +
#{thumbnail.filename}
+ +
+
+
+
- - +
+
+ + +
+
- - + \ No newline at end of file diff --git a/src/main/webapp/dataset.xhtml b/src/main/webapp/dataset.xhtml index 4380ae255c5..658b429768e 100644 --- a/src/main/webapp/dataset.xhtml +++ b/src/main/webapp/dataset.xhtml @@ -20,7 +20,28 @@ - + + + + + + + + + + + @@ -80,109 +101,191 @@
-
-
+
+
+ #{DatasetPage.datasetVersionUI.title.value} +
+ + + + + + + + +
+
+
+ + +
+
+ + + + + + + +
+ +
-
- -
- - - - - - #{bundle['contact.contact']} - - - #{bundle['share']} - +
+ +
+
+ + +
- -
- - - - - - #{bundle['dataset.publish.btn']} - - - #{bundle['dataset.publish.btn']} - - - - #{bundle['dataset.publish.btn']} - - - #{bundle['dataset.publish.btn']} - - - #{bundle['dataset.publish.btn']} - - - - - - - - - - - - - - - - #{bundle['link']} - - - - - - - - -
- - - - - - - - -
-
- - -
+ + + +
+ + #{bundle['dataset.linkBtn']} + +
+ + + +
+ + + + + + #{bundle['dataset.contactBtn']} + + + #{bundle['dataset.shareBtn']} + +
+
-
-
-
-
-
- #{DatasetPage.datasetVersionUI.title.value} - + +
+ +
+
+ #{bundle['metrics.dataset.title']} + + + + + +
-
- #{DatasetPage.datasetVersionUI.title.value} -
- - - - - - - +
+ +
+ + + +
-
-
-
- - - - - - - - -
-
-
- #{bundle['metrics.dataset.title']} - - - - - - + +
+ + + +
-
- -
- - - - -
- -
- - - - -
- -
- - - - -
- -
- - - - - - -
+ +
+ + + +
+ +
+ + + + + +
-
- -
+ +
+ + +
+ + + +
+
#{bundle['dataset.deaccession.reason']}

#{DatasetPage.workingVersion.versionNote}

#{bundle['dataset.beAccessedAt']} #{DatasetPage.workingVersion.archiveNote}

- - -
- +
+
+ @@ -551,10 +583,10 @@ styleClass="DropdownPopup" panelStyleClass="DropdownPopupPanel" var="hostDataverse" itemLabel="#{hostDataverse.displayName}" itemValue="#{hostDataverse}" converter="dataverseConverter"> - + - + @@ -677,7 +709,7 @@ - + @@ -687,9 +719,10 @@ - + @@ -701,21 +734,27 @@ and (empty DatasetPage.editMode or DatasetPage.editMode == 'METADATA')}">
+ disabled="#{DatasetPage.lockedFromEdits}" + rendered="#{!widgetWrapper.widgetView + and (DatasetPage.sessionUserAuthenticated + and empty DatasetPage.editMode and !widgetWrapper.widgetView + and DatasetPage.canUpdateDataset())}"> #{bundle['file.dataFilesTab.metadata.addBtn']} -
+
-
@@ -755,7 +794,7 @@ - +
@@ -1468,7 +1517,7 @@ onclick="PF('accessPopup').hide()" update=":datasetForm,:messagePanel" action="#{DatasetPage.restrictSelectedFiles(true)}"/> -
@@ -1481,89 +1530,71 @@
-
- -

- #{bundle['dataset.publish.tip']} -

-
- -
-
- - -
-
- -

- - - - - - - - -

-
- -
-

+ + +

+ #{bundle['dataset.publish.tip']} +

+
+ +

+ + + + + + + + +

+
+ + +

+ #{bundle['dataset.republish.tip']} +

+
+ +

#{bundle['dataset.publishBoth.tip']} -

-
- - -
- - - -

- #{bundle['dataset.republish.tip']} -

-
- +

+ +
+
- -

+ + +

#{bundle['dataset.selectVersionNumber']} +

+ + + + + + + +
+

+ + +

- - - - - - - -

- - - -

- -
- +

@@ -1576,7 +1607,7 @@

-
@@ -1598,7 +1629,7 @@

-
@@ -1621,12 +1652,12 @@
-
- + - + \ No newline at end of file diff --git a/src/main/webapp/file.xhtml b/src/main/webapp/file.xhtml index 5183761a86e..bb372c84edf 100644 --- a/src/main/webapp/file.xhtml +++ b/src/main/webapp/file.xhtml @@ -18,341 +18,368 @@ + - + - + -
+
-
-
- -
- -
- - - - - - #{bundle['contact.contact']} - - - #{bundle['share']} - +
+
+ #{FilePage.fileMetadata.label} + + + + + + + + +

+ + + +

+ +
+ + + + + + + + + + + +
+
+
+ + +
+ +
+ + +
+
+
+ + + + + +
+
- - -
- - - - - - - - - - - -
- - #{bundle['dataset.editBtn']} - +
+ + + + +
+
+
+ + + + + + +
+ +
+
+ +
+ + +
+ +
+ +
+
+ + +
-
- - +
+ +
- -
- - -
- - - - - - - - - - - - -
- + + + +
+ + + + + + #{bundle['file.contactBtn']} + + + #{bundle['file.shareBtn']} + +
+
-
-
-
-
-
- - - - - - -
- - - - - - - -
+
+ +
+
+ #{bundle['metrics.file.title']} + + + + + +
-
-
- -
-
- -
- -
-
-
-
-
- - - - - -
- -
- -
-
-
-
- - -
-

- - - -

- -
-
-
-
-
- - - - - - -
- -
- -
-
-
-
+
+ +
+ + + +
-
- - -
-
-
- #{bundle['metrics.file.title']} - - - - - - -
-
- -
- - - - -
- -
- - - - -
-
+ +
+ + + +
-
- -
-
-
-
#{bundle['dataset.deaccession.reason']}
-

#{FilePage.fileMetadata.datasetVersion.versionNote}

- -

#{bundle['dataset.beAccessedAt']} #{FilePage.fileMetadata.datasetVersion.archiveNote}

-
-
-
+ +
+ + +
+ + + +
+
+
#{bundle['dataset.deaccession.reason']}
+

#{FilePage.fileMetadata.datasetVersion.versionNote}

+ +

#{bundle['dataset.beAccessedAt']} #{FilePage.fileMetadata.datasetVersion.archiveNote}

+
-
+
+
@@ -367,7 +394,7 @@ - +
- + disabled="#{FilePage.lockedFromEdits ? 'disabled' : ''}"> #{bundle['file.dataFilesTab.metadata.addBtn']}
-
-
- -

#{bundle['dataset.share.datasetShare.tip']}

-
+ +

#{bundle['file.share.tip']}

+
+
+
diff --git a/src/main/webapp/filesFragment.xhtml b/src/main/webapp/filesFragment.xhtml index 9ac4f4890df..ad61e1f50cd 100644 --- a/src/main/webapp/filesFragment.xhtml +++ b/src/main/webapp/filesFragment.xhtml @@ -132,11 +132,11 @@ - +
@@ -529,7 +529,7 @@ and DatasetPage.workingVersion.fileMetadatas.size() > 1) and DatasetPage.downloadButtonAvailable and DatasetPage.isHasTabular()}">
diff --git a/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java b/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java index c83afc1470c..79d2785b307 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java @@ -23,8 +23,11 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import edu.harvard.iq.dataverse.dataaccess.ImageThumbConverter; +import java.awt.image.BufferedImage; +import java.io.IOException; import static junit.framework.Assert.assertEquals; import static java.lang.Thread.sleep; +import javax.imageio.ImageIO; import static javax.ws.rs.core.Response.Status.CREATED; import static javax.ws.rs.core.Response.Status.NOT_FOUND; import static javax.ws.rs.core.Response.Status.OK; @@ -32,6 +35,7 @@ import org.hamcrest.Matchers; import org.junit.After; import static org.junit.Assert.assertNotEquals; +import static java.lang.Thread.sleep; public class SearchIT { @@ -429,6 +433,24 @@ public void testDatasetThumbnail() { .contentType("image/png") .statusCode(OK.getStatusCode()); + String trueOrWidthInPixels = "true"; + Response getFileThumbnailImageA = UtilIT.getFileThumbnail(dataFileId1.toString(), trueOrWidthInPixels, apiToken); + getFileThumbnailImageA.then().assertThat() + .contentType("image/png") + .statusCode(OK.getStatusCode()); + + try { + BufferedImage bufferedImage = ImageIO.read(getFileThumbnailImageA.body().asInputStream()); + int width = bufferedImage.getWidth(); + int height = bufferedImage.getHeight(); + System.out.println("width: " + width); + System.out.println("height: " + height); + int expectedWidth = 64; + assertEquals(expectedWidth, width); + } catch (IOException ex) { + Logger.getLogger(SearchIT.class.getName()).log(Level.SEVERE, null, ex); + } + InputStream inputStream2creator = UtilIT.getInputStreamFromUnirest(thumbnailUrl, apiToken); assertEquals(treesAsBase64, UtilIT.inputStreamToDataUrlSchemeBase64Png(inputStream2creator)); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java index 9007cc6655a..ab9b9e05073 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -510,6 +510,14 @@ static Response updateDatasetPIDMetadata(String persistentId, String apiToken) .post("/api/datasets/:persistentId/modifyRegistrationMetadata/?persistentId=" + persistentId); return response; } + + static Response loadMetadataBlock(String apiToken, byte[] body) { + return given() + .header(API_TOKEN_HTTP_HEADER, apiToken) + .contentType("text/tab-separated-values; charset=utf-8") + .body(body) + .post("/api/admin/datasetfield/load"); + } static private String getDatasetXml(String title, String author, String description) { String xmlIn = "\n" @@ -1395,12 +1403,13 @@ static Response getDatasetThumbnailMetadata(Integer datasetId, String apiToken) .get("/api/admin/datasets/thumbnailMetadata/" + datasetId); } - static Response loadMetadataBlock(String apiToken, byte[] body) { + /** + * @param trueOrWidthInPixels Passing "true" will result in the default width in pixels (64). + */ + static Response getFileThumbnail(String fileDatabaseId, String trueOrWidthInPixels, String apiToken) { return given() - .header(API_TOKEN_HTTP_HEADER, apiToken) - .contentType("text/tab-separated-values; charset=utf-8") - .body(body) - .post("/api/admin/datasetfield/load"); + .header(API_TOKEN_HTTP_HEADER, apiToken) + .get("/api/access/datafile/" + fileDatabaseId + "?imageThumb=" + trueOrWidthInPixels); } static Response useThumbnailFromDataFile(String datasetPersistentId, long dataFileId1, String apiToken) { diff --git a/src/test/java/edu/harvard/iq/dataverse/dataset/DatasetUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/dataset/DatasetUtilTest.java index bb19a32c4f8..bc63c94153f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/dataset/DatasetUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/dataset/DatasetUtilTest.java @@ -23,7 +23,7 @@ public class DatasetUtilTest { */ @Test public void testGetThumbnailCandidates() { - assertEquals(new ArrayList<>(), DatasetUtil.getThumbnailCandidates(null, false)); + assertEquals(new ArrayList<>(), DatasetUtil.getThumbnailCandidates(null, false, ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE)); Dataset dataset = MocksFactory.makeDataset(); DataFile dataFile = MocksFactory.makeDataFile(); @@ -37,21 +37,21 @@ public void testGetThumbnailCandidates() { List fmds = new ArrayList<>(); fmds.add(MocksFactory.addFileMetadata(dataFile)); version.setFileMetadatas(fmds); - assertEquals(new ArrayList<>(), DatasetUtil.getThumbnailCandidates(dataset, false)); + assertEquals(new ArrayList<>(), DatasetUtil.getThumbnailCandidates(dataset, false, ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE)); } @Test public void testGetThumbnailNullDataset() { - assertNull(DatasetUtil.getThumbnail(null)); - assertNull(DatasetUtil.getThumbnail(null, null)); + assertNull(DatasetUtil.getThumbnail(null, ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE)); + assertNull(DatasetUtil.getThumbnail(null, null, ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE)); Dataset dataset = MocksFactory.makeDataset(); System.setProperty("dataverse.files.testfile.type", "file"); dataset.setStorageIdentifier("testfile://"); dataset.setUseGenericThumbnail(true); - assertNull(DatasetUtil.getThumbnail(dataset)); - assertNull(DatasetUtil.getThumbnail(dataset, new DatasetVersion())); + assertNull(DatasetUtil.getThumbnail(dataset, ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE)); + assertNull(DatasetUtil.getThumbnail(dataset, new DatasetVersion(), ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE)); } @Test @@ -62,7 +62,7 @@ public void testGetThumbnailRestricted() { thumbnailFile.setId(42l); thumbnailFile.setRestricted(true); dataset.setThumbnailFile(thumbnailFile); - DatasetThumbnail result = DatasetUtil.getThumbnail(dataset); + DatasetThumbnail result = DatasetUtil.getThumbnail(dataset, ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE); assertNull(result); } /** @@ -88,7 +88,7 @@ public void testGetDefaultThumbnailFile() { */ @Test public void testPersistDatasetLogoToStorageAndCreateThumbnail() { - assertNull(DatasetUtil.persistDatasetLogoToStorageAndCreateThumbnail(null, null)); + assertNull(DatasetUtil.persistDatasetLogoToStorageAndCreateThumbnails(null, null)); //Todo: a test for this that test main logic } @@ -97,7 +97,7 @@ public void testPersistDatasetLogoToStorageAndCreateThumbnail() { */ @Test public void testGetThumbnailAsInputStream() { - assertNull(DatasetUtil.getThumbnailAsInputStream(null)); + assertNull(DatasetUtil.getThumbnailAsInputStream(null, ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE)); } /** @@ -106,7 +106,7 @@ public void testGetThumbnailAsInputStream() { @Test public void testIsDatasetLogoPresent() { Dataset dataset = MocksFactory.makeDataset(); - assertEquals(false, DatasetUtil.isDatasetLogoPresent(dataset)); + assertEquals(false, DatasetUtil.isDatasetLogoPresent(dataset, ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE)); } @Test