From 55fc1286c8c5152895f24f41fe642327e2233caa Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Wed, 21 Dec 2016 13:41:10 -0500 Subject: [PATCH 1/7] add :GuidesVersion config option #3540 --- doc/sphinx-guides/source/installation/config.rst | 7 +++++++ .../java/edu/harvard/iq/dataverse/DataversePage.java | 2 +- .../java/edu/harvard/iq/dataverse/MailServiceBean.java | 6 +++--- .../iq/dataverse/settings/SettingsServiceBean.java | 2 ++ .../java/edu/harvard/iq/dataverse/util/SystemConfig.java | 9 +++++++++ src/main/webapp/dashboard.xhtml | 2 +- src/main/webapp/dataset-widgets.xhtml | 6 +++--- src/main/webapp/dataset.xhtml | 2 +- src/main/webapp/dataverse_header.xhtml | 4 ++-- src/main/webapp/dataverseuser.xhtml | 8 ++++---- src/main/webapp/editFilesFragment.xhtml | 2 +- src/main/webapp/harvestclients.xhtml | 2 +- src/main/webapp/harvestsets.xhtml | 2 +- src/main/webapp/loginpage.xhtml | 2 +- src/main/webapp/manage-groups.xhtml | 2 +- src/main/webapp/manage-guestbooks.xhtml | 2 +- src/main/webapp/manage-templates.xhtml | 2 +- src/main/webapp/search-include-fragment.xhtml | 6 +++--- src/main/webapp/themeAndWidgetsFragment.xhtml | 6 +++--- 19 files changed, 46 insertions(+), 28 deletions(-) diff --git a/doc/sphinx-guides/source/installation/config.rst b/doc/sphinx-guides/source/installation/config.rst index 230e87808b7..58f88e86c17 100644 --- a/doc/sphinx-guides/source/installation/config.rst +++ b/doc/sphinx-guides/source/installation/config.rst @@ -345,6 +345,13 @@ Set ``GuidesBaseUrl`` to override the default value "http://guides.dataverse.org ``curl -X PUT -d http://dataverse.example.edu http://localhost:8080/api/admin/settings/:GuidesBaseUrl`` +:GuidesVersion +++++++++++++++ + +Set ``:GuidesVersion`` to override the version number in the URL of guides. For example, rather than http://guides.dataverse.org/en/4.6/user/account.html the version is overriden to http://guides.dataverse.org/en/1234-new-feature/user/account.html in the example below: + +``curl -X PUT -d 1234-new-feature http://localhost:8080/api/admin/settings/:GuidesVersion`` + :StatusMessageHeader ++++++++++++++++++++ diff --git a/src/main/java/edu/harvard/iq/dataverse/DataversePage.java b/src/main/java/edu/harvard/iq/dataverse/DataversePage.java index 3d35e548347..112073cc8c1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataversePage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataversePage.java @@ -628,7 +628,7 @@ public String save() { if (editMode != null && editMode.equals(EditMode.FEATURED)) { message = "The featured dataverses for this dataverse have been updated."; } else { - message = (create) ? BundleUtil.getStringFromBundle("dataverse.create.success", Arrays.asList(settingsWrapper.getGuidesBaseUrl(), systemConfig.getVersion())) : BundleUtil.getStringFromBundle("dataverse.update.success"); + message = (create) ? BundleUtil.getStringFromBundle("dataverse.create.success", Arrays.asList(settingsWrapper.getGuidesBaseUrl(), systemConfig.getGuidesVersion())) : BundleUtil.getStringFromBundle("dataverse.update.success"); } JsfHelper.addSuccessMessage(message); diff --git a/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java index 0893909a6c0..d5cf2728d9d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java @@ -364,7 +364,7 @@ private String getMessageTextBasedOnNotification(UserNotification userNotificati parentDataverseDisplayName, parentDataverseUrl, systemConfig.getGuidesBaseUrl(), - systemConfig.getVersion())); + systemConfig.getGuidesVersion())); logger.fine(dataverseCreatedMessage); return messageText += dataverseCreatedMessage; case REQUESTFILEACCESS: @@ -393,7 +393,7 @@ private String getMessageTextBasedOnNotification(UserNotification userNotificati version.getDataset().getOwner().getDisplayName(), getDataverseLink(version.getDataset().getOwner()), systemConfig.getGuidesBaseUrl(), - systemConfig.getVersion() + systemConfig.getGuidesVersion() )); logger.fine(datasetCreatedMessage); return messageText += datasetCreatedMessage; @@ -427,7 +427,7 @@ private String getMessageTextBasedOnNotification(UserNotification userNotificati case CREATEACC: String accountCreatedMessage = BundleUtil.getStringFromBundle("notification.email.welcome", Arrays.asList( systemConfig.getGuidesBaseUrl(), - systemConfig.getVersion() + systemConfig.getGuidesVersion() )); String optionalConfirmEmailAddon = confirmEmailService.optionalConfirmEmailAddonMsg(userNotification.getUser()); accountCreatedMessage += optionalConfirmEmailAddon; diff --git a/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java index 4b8e6a85a10..3528a5c5de7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java @@ -153,6 +153,8 @@ public enum Key { /** Optionally override http://guides.dataverse.org . */ GuidesBaseUrl, /* zip download size limit */ + /** Optionally override version number in guides. */ + GuidesVersion, ZipDownloadLimit, /* zip upload number of files limit */ ZipUploadFilesLimit, diff --git a/src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java b/src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java index 831554565eb..0cdea4faee2 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java @@ -310,6 +310,15 @@ private String getGuidesLanguage() { return saneDefault; } + public String getGuidesVersion() { + String saneDefault = getVersion(); + String guidesVersion = settingsService.getValueForKey(SettingsServiceBean.Key.GuidesVersion, saneDefault); + if (guidesVersion != null) { + return guidesVersion; + } + return saneDefault; + } + /** * Download-as-zip size limit. * returns 0 if not specified; diff --git a/src/main/webapp/dashboard.xhtml b/src/main/webapp/dashboard.xhtml index c49d2f51113..ac170efe593 100644 --- a/src/main/webapp/dashboard.xhtml +++ b/src/main/webapp/dashboard.xhtml @@ -94,7 +94,7 @@ - +

diff --git a/src/main/webapp/dataset-widgets.xhtml b/src/main/webapp/dataset-widgets.xhtml index f3beab749e6..5babbe14052 100644 --- a/src/main/webapp/dataset-widgets.xhtml +++ b/src/main/webapp/dataset-widgets.xhtml @@ -35,14 +35,14 @@
  • - +
  • - +

    @@ -52,7 +52,7 @@

    - +

    diff --git a/src/main/webapp/dataset.xhtml b/src/main/webapp/dataset.xhtml index 7e1b0431130..98d05a4414b 100755 --- a/src/main/webapp/dataset.xhtml +++ b/src/main/webapp/dataset.xhtml @@ -653,7 +653,7 @@

      - +

    diff --git a/src/main/webapp/dataverse_header.xhtml b/src/main/webapp/dataverse_header.xhtml index fea38c2b512..07aa6af451c 100644 --- a/src/main/webapp/dataverse_header.xhtml +++ b/src/main/webapp/dataverse_header.xhtml @@ -58,7 +58,7 @@
    diff --git a/src/main/webapp/harvestsets.xhtml b/src/main/webapp/harvestsets.xhtml index b7c87a19499..c3a5db04df5 100644 --- a/src/main/webapp/harvestsets.xhtml +++ b/src/main/webapp/harvestsets.xhtml @@ -84,7 +84,7 @@

    - +

    diff --git a/src/main/webapp/loginpage.xhtml b/src/main/webapp/loginpage.xhtml index 91e2b700a42..72694fbd184 100644 --- a/src/main/webapp/loginpage.xhtml +++ b/src/main/webapp/loginpage.xhtml @@ -99,7 +99,7 @@ - + diff --git a/src/main/webapp/manage-groups.xhtml b/src/main/webapp/manage-groups.xhtml index 116ebc76212..77a6440d11f 100644 --- a/src/main/webapp/manage-groups.xhtml +++ b/src/main/webapp/manage-groups.xhtml @@ -48,7 +48,7 @@

    - +

    diff --git a/src/main/webapp/manage-guestbooks.xhtml b/src/main/webapp/manage-guestbooks.xhtml index e06bfd1f30b..9c9d373fa4a 100644 --- a/src/main/webapp/manage-guestbooks.xhtml +++ b/src/main/webapp/manage-guestbooks.xhtml @@ -64,7 +64,7 @@

    - +

    diff --git a/src/main/webapp/manage-templates.xhtml b/src/main/webapp/manage-templates.xhtml index 73a58d7ffc4..fb91d5a9fa1 100644 --- a/src/main/webapp/manage-templates.xhtml +++ b/src/main/webapp/manage-templates.xhtml @@ -58,7 +58,7 @@

    - +

    diff --git a/src/main/webapp/search-include-fragment.xhtml b/src/main/webapp/search-include-fragment.xhtml index 40e689c9869..0ce7a5e31db 100644 --- a/src/main/webapp/search-include-fragment.xhtml +++ b/src/main/webapp/search-include-fragment.xhtml @@ -243,14 +243,14 @@

    - +

    - +

    @@ -299,7 +299,7 @@

    - +

    diff --git a/src/main/webapp/themeAndWidgetsFragment.xhtml b/src/main/webapp/themeAndWidgetsFragment.xhtml index 8fb2bb08c3f..8f0bcb8d5f9 100644 --- a/src/main/webapp/themeAndWidgetsFragment.xhtml +++ b/src/main/webapp/themeAndWidgetsFragment.xhtml @@ -199,14 +199,14 @@
  • - +
  • - +

    @@ -216,7 +216,7 @@

    - +

    From 56db0a8607dd8fcb9679075db3b5e32040cd8aa0 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Wed, 21 Dec 2016 13:56:31 -0500 Subject: [PATCH 2/7] Suppress "WARNING: unknown mimetype for ..." when building epub #3391 Requires Sphinx 1.5.1 or higher per https://github.com/sphinx-doc/sphinx/issues/3214 --- doc/sphinx-guides/source/conf.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/sphinx-guides/source/conf.py b/doc/sphinx-guides/source/conf.py index 4153e93a64f..1b2a106add3 100755 --- a/doc/sphinx-guides/source/conf.py +++ b/doc/sphinx-guides/source/conf.py @@ -425,3 +425,5 @@ # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = {'http://docs.python.org/': None} +# Suppress "WARNING: unknown mimetype for ..." https://github.com/IQSS/dataverse/issues/3391 +suppress_warnings = ['epub.unknown_project_files'] From 6f71364dba9b1d921865371db03864f81377fe92 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Wed, 21 Dec 2016 16:36:45 -0500 Subject: [PATCH 3/7] write tests around expected file citation filenames #3537 --- .../iq/dataverse/FileDownloadServiceBean.java | 7 ++-- .../harvard/iq/dataverse/util/FileUtil.java | 33 +++++++++++++++++-- .../iq/dataverse/util/FileUtilTest.java | 28 ++++++++++++++++ 3 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 src/test/java/edu/harvard/iq/dataverse/util/FileUtilTest.java diff --git a/src/main/java/edu/harvard/iq/dataverse/FileDownloadServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/FileDownloadServiceBean.java index ccc8f6847b7..c78445d61aa 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FileDownloadServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/FileDownloadServiceBean.java @@ -8,6 +8,7 @@ import edu.harvard.iq.dataverse.engine.command.exception.CommandException; import edu.harvard.iq.dataverse.engine.command.impl.CreateGuestbookResponseCommand; import edu.harvard.iq.dataverse.engine.command.impl.RequestAccessCommand; +import edu.harvard.iq.dataverse.util.FileUtil; import java.io.IOException; import java.sql.Timestamp; import java.util.ArrayList; @@ -295,7 +296,7 @@ public void downloadCitationXML(FileMetadata fileMetadata, Dataset dataset) { fileNameString = "attachment;filename=" + getFileNameDOI(workingVersion) + ".xml"; } else { // Datafile-level citation: - fileNameString = "attachment;filename=" + getFileNameDOI(workingVersion) + "-" + fileMetadata.getLabel().replaceAll("\\.tab$", "-endnote.xml"); + fileNameString = "attachment;filename=" + getFileNameDOI(workingVersion) + "-" + FileUtil.getCiteDataFileFilename(fileMetadata, FileUtil.FileCitationExtension.ENDNOTE); } response.setHeader("Content-Disposition", fileNameString); try { @@ -336,7 +337,7 @@ public void downloadCitationRIS(FileMetadata fileMetadata, Dataset dataset) { fileNameString = "attachment;filename=" + getFileNameDOI(workingVersion) + ".ris"; } else { // Datafile-level citation: - fileNameString = "attachment;filename=" + getFileNameDOI(workingVersion) + "-" + fileMetadata.getLabel().replaceAll("\\.tab$", ".ris"); + fileNameString = "attachment;filename=" + getFileNameDOI(workingVersion) + "-" + FileUtil.getCiteDataFileFilename(fileMetadata, FileUtil.FileCitationExtension.RIS); } response.setHeader("Content-Disposition", fileNameString); @@ -383,7 +384,7 @@ public void downloadCitationBibtex(FileMetadata fileMetadata, Dataset dataset) { fileNameString = "attachment;filename=" + getFileNameDOI(workingVersion) + ".bib"; } else { // Datafile-level citation: - fileNameString = "attachment;filename=" + getFileNameDOI(workingVersion) + "-" + fileMetadata.getLabel().replaceAll("\\.tab$", ".bib"); + fileNameString = "attachment;filename=" + getFileNameDOI(workingVersion) + "-" + FileUtil.getCiteDataFileFilename(fileMetadata, FileUtil.FileCitationExtension.BIBTEX); } response.setHeader("Content-Disposition", fileNameString); diff --git a/src/main/java/edu/harvard/iq/dataverse/util/FileUtil.java b/src/main/java/edu/harvard/iq/dataverse/util/FileUtil.java index 962be6751a4..4d399847893 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/FileUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/FileUtil.java @@ -1153,7 +1153,34 @@ private static void createIngestReport (DataFile dataFile, int status, String me dataFile.setIngestReport(errorReport); } } - - - + + public enum FileCitationExtension { + + ENDNOTE("-endnote.xml"), + RIS(".ris"), + BIBTEX(".bib"); + + private final String text; + + private FileCitationExtension(final String text) { + this.text = text; + } + } + + public static String getCiteDataFileFilename(FileMetadata fileMetadata, FileCitationExtension fileCitationExtension) { + if (fileMetadata == null) { + logger.info("In getCitationBibtex but FileMetadata is null!"); + return null; + } + if (fileCitationExtension == null) { + logger.info("In getCitationBibtex but fileCitationExtension is null!"); + return null; + } + if (fileMetadata.getLabel().endsWith("tab")) { + return fileMetadata.getLabel().replaceAll("\\.tab$", fileCitationExtension.text); + } else { + return fileMetadata.getLabel() + fileCitationExtension.text; + } + } + } diff --git a/src/test/java/edu/harvard/iq/dataverse/util/FileUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/util/FileUtilTest.java new file mode 100644 index 00000000000..0884b812290 --- /dev/null +++ b/src/test/java/edu/harvard/iq/dataverse/util/FileUtilTest.java @@ -0,0 +1,28 @@ +package edu.harvard.iq.dataverse.util; + +import edu.harvard.iq.dataverse.FileMetadata; +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +public class FileUtilTest { + + @Test + public void testGetCiteDataFileFilename() { + + assertEquals(null, FileUtil.getCiteDataFileFilename(null, null)); + + FileMetadata png = new FileMetadata(); + png.setLabel("trees.png"); + assertEquals("trees.png-endnote.xml", FileUtil.getCiteDataFileFilename(png, FileUtil.FileCitationExtension.ENDNOTE)); + assertEquals("trees.png.ris", FileUtil.getCiteDataFileFilename(png, FileUtil.FileCitationExtension.RIS)); + assertEquals("trees.png.bib", FileUtil.getCiteDataFileFilename(png, FileUtil.FileCitationExtension.BIBTEX)); + assertEquals(null, FileUtil.getCiteDataFileFilename(png, null)); + + FileMetadata tabular = new FileMetadata(); + tabular.setLabel("50by1000.tab"); + assertEquals("50by1000-endnote.xml", FileUtil.getCiteDataFileFilename(tabular, FileUtil.FileCitationExtension.ENDNOTE)); + assertEquals("50by1000.ris", FileUtil.getCiteDataFileFilename(tabular, FileUtil.FileCitationExtension.RIS)); + assertEquals("50by1000.bib", FileUtil.getCiteDataFileFilename(tabular, FileUtil.FileCitationExtension.BIBTEX)); + } + +} From b9e8183c03a7076ce28b4b9140929e9484c675b0 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Thu, 22 Dec 2016 12:02:09 -0500 Subject: [PATCH 4/7] Native API publish: POST, no 0.1, DOIs #2431 #2461 #3483 #3547 --- doc/sphinx-guides/source/api/native-api.rst | 2 + .../harvard/iq/dataverse/api/Datasets.java | 69 +++++++++++-------- .../command/impl/PublishDatasetCommand.java | 5 ++ .../harvard/iq/dataverse/api/DatasetsIT.java | 23 ++++++- .../harvard/iq/dataverse/api/SearchIT.java | 4 -- .../edu/harvard/iq/dataverse/api/UtilIT.java | 23 +++++-- 6 files changed, 85 insertions(+), 41 deletions(-) diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst index c7f15c43e2b..1f115f831aa 100644 --- a/doc/sphinx-guides/source/api/native-api.rst +++ b/doc/sphinx-guides/source/api/native-api.rst @@ -169,6 +169,8 @@ Publishes the dataset whose id is passed. The new dataset version number is dete POST http://$SERVER/api/datasets/$id/actions/:publish?type=$type&key=$apiKey +.. note:: POST should be used to publish a dataset. GET is supported for backward compatibility but is deprecated and may be removed: https://github.com/IQSS/dataverse/issues/2431 + Deletes the draft version of dataset ``$id``. Only the draft version can be deleted:: DELETE http://$SERVER/api/datasets/$id/versions/:draft?key=$apiKey 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 5e5670ab57a..d7218757aec 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -68,7 +68,7 @@ @Path("datasets") public class Datasets extends AbstractApiBean { - private static final Logger LOGGER = Logger.getLogger(Datasets.class.getName()); + private static final Logger logger = Logger.getLogger(Datasets.class.getCanonicalName()); private static final String PERSISTENT_ID_KEY=":persistentId"; @@ -148,7 +148,7 @@ public Response exportDataset(@QueryParam("persistentId") String persistentId, @ // (the way Access API streams its output). // -- L.A., 4.5 - LOGGER.fine("xml to return: " + xml); + logger.fine("xml to return: " + xml); String mediaType = MediaType.TEXT_PLAIN; if (instance.isXMLFormat(exporter)){ mediaType = MediaType.APPLICATION_XML; @@ -334,7 +334,7 @@ public Response updateDraftVersion( String jsonBody, @PathParam("id") String id, return ok( json(managedVersion) ); } catch (JsonParseException ex) { - LOGGER.log(Level.SEVERE, "Semantic error parsing dataset version Json: " + ex.getMessage(), ex); + logger.log(Level.SEVERE, "Semantic error parsing dataset version Json: " + ex.getMessage(), ex); return error( Response.Status.BAD_REQUEST, "Error parsing dataset version: " + ex.getMessage() ); } catch (WrappedResponse ex) { @@ -343,36 +343,45 @@ public Response updateDraftVersion( String jsonBody, @PathParam("id") String id, } } + /** + * @deprecated This was shipped as a GET but should have been a POST, see https://github.com/IQSS/dataverse/issues/2431 + */ @GET - @Path("{id}/actions/:publish") - public Response publishDataset( @PathParam("id") String id, @QueryParam("type") String type ) { + @Path("{id}/actions/:publish") + @Deprecated + public Response publishDataseUsingGetDeprecated( @PathParam("id") String id, @QueryParam("type") String type ) { + logger.info("publishDataseUsingGetDeprecated called on id " + id + ". Encourage use of POST rather than GET, which is deprecated."); + return publishDataset(id, type); + } + + @POST + @Path("{id}/actions/:publish") + public Response publishDataset(@PathParam("id") String id, @QueryParam("type") String type) { try { - if ( type == null ) { - return error( Response.Status.BAD_REQUEST, "Missing 'type' parameter (either 'major' or 'minor')."); + if (type == null) { + return error(Response.Status.BAD_REQUEST, "Missing 'type' parameter (either 'major' or 'minor')."); } - + type = type.toLowerCase(); boolean isMinor; - switch ( type ) { - case "minor": isMinor = true; break; - case "major": isMinor = false; break; - default: return error( Response.Status.BAD_REQUEST, "Illegal 'type' parameter value '" + type + "'. It needs to be either 'major' or 'minor'."); + switch (type) { + case "minor": + isMinor = true; + break; + case "major": + isMinor = false; + break; + default: + return error(Response.Status.BAD_REQUEST, "Illegal 'type' parameter value '" + type + "'. It needs to be either 'major' or 'minor'."); } - long dsId; - try { - dsId = Long.parseLong(id); - } catch ( NumberFormatException nfe ) { - return error( Response.Status.BAD_REQUEST, "Bad dataset id. Please provide a number."); - } - - Dataset ds = datasetService.find(dsId); - - return ( ds == null ) ? notFound("Can't find dataset with id '" + id + "'") - : ok( json(execCommand(new PublishDatasetCommand(ds, - createDataverseRequest(findAuthenticatedUserOrDie()), - isMinor))) ); - - } catch (WrappedResponse ex) { + + Dataset ds = findDatasetOrDie(id); + + return ok(json(execCommand(new PublishDatasetCommand(ds, + createDataverseRequest(findAuthenticatedUserOrDie()), + isMinor)))); + + } catch (WrappedResponse ex) { return ex.getResponse(); } } @@ -420,7 +429,7 @@ public Response getDdi(@QueryParam("id") long id, @QueryParam("persistentId") St return error(Response.Status.FORBIDDEN, "Not a superuser"); } - LOGGER.fine("looking up " + persistentId); + logger.fine("looking up " + persistentId); Dataset dataset = datasetService.findByGlobalId(persistentId); if (dataset == null) { return error(Response.Status.NOT_FOUND, "A dataset with the persistentId " + persistentId + " could not be found."); @@ -439,7 +448,7 @@ public Response getDdi(@QueryParam("id") long id, @QueryParam("persistentId") St ddiExportService.exportDataset(dataset.getId(), outputStream, null, null); xml = outputStream.toString(); } - LOGGER.fine("xml to return: " + xml); + logger.fine("xml to return: " + xml); return Response.ok() .entity(xml) @@ -473,7 +482,7 @@ public Response createAssignment(String userOrGroup, @PathParam("identifier") St return ok( json(execCommand(new AssignRoleCommand(assignee, theRole, dataset, createDataverseRequest(findUserOrDie()), privateUrlToken)))); } catch (WrappedResponse ex) { - LOGGER.log(Level.WARNING, "Can''t create assignment: {0}", ex.getMessage()); + logger.log(Level.WARNING, "Can''t create assignment: {0}", ex.getMessage()); return ex.getResponse(); } } 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 43d24095396..ef5f54c279a 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 @@ -77,6 +77,11 @@ public Dataset execute(CommandContext ctxt) throws CommandException { throw new IllegalCommandException("Latest version of dataset " + theDataset.getIdentifier() + " is already released. Only draft versions can be released.", this); } + // prevent publishing of 0.1 version + if (minorRelease && theDataset.getVersions().size() == 1 && theDataset.getLatestVersion().isDraft()) { + throw new IllegalCommandException("Cannot publish as minor version. Re-try as major release.", this); + } + if (minorRelease && !theDataset.getLatestVersion().isMinorUpdate()) { throw new IllegalCommandException("Cannot release as minor version. Re-try as major release.", this); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java index e392f0cf7ab..16c7fffe8db 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java @@ -26,7 +26,6 @@ import java.util.UUID; import static javax.ws.rs.core.Response.Status.NO_CONTENT; import static junit.framework.Assert.assertEquals; -import org.hamcrest.CoreMatchers; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.nullValue; @@ -91,11 +90,31 @@ public void testCreatePublishDestroyDataset() { createDatasetResponse.prettyPrint(); Integer datasetId = JsonPath.from(createDatasetResponse.body().asString()).getInt("data.id"); + Response getDatasetJsonBeforePublishing = UtilIT.nativeGet(datasetId, apiToken); + getDatasetJsonBeforePublishing.prettyPrint(); + String protocol = JsonPath.from(getDatasetJsonBeforePublishing.getBody().asString()).getString("data.protocol"); + String authority = JsonPath.from(getDatasetJsonBeforePublishing.getBody().asString()).getString("data.authority"); + String identifier = JsonPath.from(getDatasetJsonBeforePublishing.getBody().asString()).getString("data.identifier"); + String datasetPersistentId = protocol + ":" + authority + "/" + identifier; + Response publishDataverse = UtilIT.publishDataverseViaSword(dataverseAlias, apiToken); assertEquals(200, publishDataverse.getStatusCode()); - Response publishDataset = UtilIT.publishDatasetViaNativeApi(datasetId, "major", apiToken); + Response attemptToPublishZeroDotOne = UtilIT.publishDatasetViaNativeApiDeprecated(datasetPersistentId, "minor", apiToken); + attemptToPublishZeroDotOne.prettyPrint(); + attemptToPublishZeroDotOne.then().assertThat() + .body("message", equalTo("Cannot publish as minor version. Re-try as major release.")) + .statusCode(403); + + Response publishDataset = UtilIT.publishDatasetViaNativeApi(datasetPersistentId, "major", apiToken); assertEquals(200, publishDataset.getStatusCode()); + Response getDatasetJsonAfterPublishing = UtilIT.nativeGet(datasetId, apiToken); + getDatasetJsonAfterPublishing.prettyPrint(); + getDatasetJsonAfterPublishing.then().assertThat() + .body("data.latestVersion.versionNumber", equalTo(1)) + .body("data.latestVersion.versionMinorNumber", equalTo(0)) + .statusCode(OK.getStatusCode()); + Response deleteDatasetResponse = UtilIT.destroyDataset(datasetId, apiToken); deleteDatasetResponse.prettyPrint(); assertEquals(200, deleteDatasetResponse.getStatusCode()); 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 ae5f8ec7182..9c78b005e30 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/SearchIT.java @@ -1165,10 +1165,6 @@ private Response publishDatasetViaNative(long datasetId, String apiToken) { /** * This should probably be a POST rather than a GET: * https://github.com/IQSS/dataverse/issues/2431 - * - * Allows version less than v1.0 to be published (i.e. v0.1): - * https://github.com/IQSS/dataverse/issues/2461 - * */ return given() .header(keyString, apiToken) 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 ee651ecab64..286ed5884fc 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -20,9 +20,7 @@ import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import static com.jayway.restassured.RestAssured.given; import static com.jayway.restassured.path.xml.XmlPath.from; -import java.math.BigDecimal; import java.util.List; -import javax.json.JsonValue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; @@ -426,13 +424,28 @@ static Response publishDatasetViaSword(String persistentId, String apiToken) { .post(swordConfiguration.getBaseUrlPathCurrent() + "/edit/study/" + persistentId); } + static Response publishDatasetViaNativeApi(String persistentId, String majorOrMinor, String apiToken) { + return given() + .header(API_TOKEN_HTTP_HEADER, apiToken) + .urlEncodingEnabled(false) + .post("/api/datasets/:persistentId/actions/:publish?type=" + majorOrMinor + "&persistentId=" + persistentId); + } + + static Response publishDatasetViaNativeApiDeprecated(String persistentId, String majorOrMinor, String apiToken) { + /** + * @todo This should be a POST rather than a GET: + * https://github.com/IQSS/dataverse/issues/2431 + */ + return given() + .header(API_TOKEN_HTTP_HEADER, apiToken) + .urlEncodingEnabled(false) + .get("/api/datasets/:persistentId/actions/:publish?type=" + majorOrMinor + "&persistentId=" + persistentId); + } + static Response publishDatasetViaNativeApi(Integer datasetId, String majorOrMinor, String apiToken) { /** * @todo This should be a POST rather than a GET: * https://github.com/IQSS/dataverse/issues/2431 - * - * @todo Prevent version less than v1.0 to be published (i.e. v0.1): - * https://github.com/IQSS/dataverse/issues/2461 */ return given() .header(API_TOKEN_HTTP_HEADER, apiToken) From aa9be5c4e436ef2d6c98070d80cf02977f74a9bb Mon Sep 17 00:00:00 2001 From: Michael Heppler Date: Tue, 3 Jan 2017 14:09:33 -0500 Subject: [PATCH 5/7] Added static link to Metrics block on dataverse pg. Restyled the Metrics blocks, removed all old, commented-out "coming soon" references. [ref #3538] --- src/main/java/Bundle.properties | 1 + src/main/webapp/dataset.xhtml | 44 +++--------------- src/main/webapp/dataverse.xhtml | 49 +++++---------------- src/main/webapp/file.xhtml | 44 +++--------------- src/main/webapp/resources/css/structure.css | 13 ++++-- 5 files changed, 36 insertions(+), 115 deletions(-) diff --git a/src/main/java/Bundle.properties b/src/main/java/Bundle.properties index e768e4c6b99..c4f740570ba 100755 --- a/src/main/java/Bundle.properties +++ b/src/main/java/Bundle.properties @@ -1014,6 +1014,7 @@ dataset.exportBtn.itemLabel.ddi=DDI dataset.exportBtn.itemLabel.dublinCore=Dublin Core dataset.exportBtn.itemLabel.json=JSON metrics.title=Metrics +metrics.title.tip=View more metrics information metrics.comingsoon=Coming soon... metrics.views=Views metrics.downloads={0, choice, 0#Downloads|1#Download|2#Downloads} diff --git a/src/main/webapp/dataset.xhtml b/src/main/webapp/dataset.xhtml index 7e1b0431130..8b2c39e6d54 100755 --- a/src/main/webapp/dataset.xhtml +++ b/src/main/webapp/dataset.xhtml @@ -40,44 +40,14 @@
    -
    -
    - #{bundle['metrics.title']} +
    +
    + #{bundle['metrics.title']}
    -
    -
    -
    - #{bundle['metrics.views']} #{bundle['metrics.comingsoon']} -
    -
    - - - -
    -
    - #{bundle['metrics.citations']} #{bundle['metrics.comingsoon']} -
    -
    - #{bundle['metrics.shares']} #{bundle['metrics.comingsoon']} -
    -
    -
    - -
    -   -
    -
    -   -
    -
    -   -
    -
    -   -
    -
    +
    + + +
    diff --git a/src/main/webapp/dataverse.xhtml b/src/main/webapp/dataverse.xhtml index 321de8ad272..a68f27dfa33 100644 --- a/src/main/webapp/dataverse.xhtml +++ b/src/main/webapp/dataverse.xhtml @@ -496,44 +496,19 @@ -
    -
    - #{bundle['metrics.title']} +
    +
    + + #{bundle['metrics.title']} + + + #{bundle['metrics.title']} +
    -
    -
    -
    - #{bundle['metrics.views']} #{bundle['metrics.comingsoon']} -
    -
    - - - -
    -
    - #{bundle['metrics.citations']} #{bundle['metrics.comingsoon']} -
    -
    - #{bundle['metrics.shares']} #{bundle['metrics.comingsoon']} -
    -
    -
    - -
    -   -
    -
    -   -
    -
    -   -
    -
    -   -
    -
    +
    + + +
    diff --git a/src/main/webapp/file.xhtml b/src/main/webapp/file.xhtml index 667229e9680..7f1af6e0160 100644 --- a/src/main/webapp/file.xhtml +++ b/src/main/webapp/file.xhtml @@ -29,44 +29,14 @@
    -
    -
    - #{bundle['metrics.title']} +
    +
    + #{bundle['metrics.title']}
    -
    -
    -
    - #{bundle['metrics.views']} #{bundle['metrics.comingsoon']} -
    -
    - - - -
    -
    - #{bundle['metrics.citations']} #{bundle['metrics.comingsoon']} -
    -
    - #{bundle['metrics.shares']} #{bundle['metrics.comingsoon']} -
    -
    -
    - -
    -   -
    -
    -   -
    -
    -   -
    -
    -   -
    -
    +
    + + +
    diff --git a/src/main/webapp/resources/css/structure.css b/src/main/webapp/resources/css/structure.css index c2f0817e432..ae6eb71235d 100644 --- a/src/main/webapp/resources/css/structure.css +++ b/src/main/webapp/resources/css/structure.css @@ -540,16 +540,21 @@ div.ui-tabs-panels .ui-tabs.ui-tabs-top .ui-tabs-nav.ui-widget-header {border-bo div[id$='roleDisplay'] span.label, div[id$='roleDetails'] span.label {display:inline-block; margin-bottom:4px;} /* -------- METRICS -------- */ -#metrics-block {width:238px;} -#metrics-label {background:#6f5499;color:#fff;padding: 7px 10px;} -#metrics-content {background:#6f5499;position:relative;min-height:21px;} -#metrics-content div.tab-pane {color:#fff;padding: 2px 0;width:152px;position:absolute;top:0;left:0;} +#metrics-block.col-xs-4 {border:1px solid #6f5499;background:#6f5499;padding:0;} +#metrics-label {color:#fff;} +#metrics-label a {color:#fff;display:block;} +#metrics-label a:hover {text-decoration:none;} +#metrics-label span.metrics-label-text {} +#metrics-content {color:#6f5499;background:#fff;} +/* -- #metrics-tabs a {background:#428bca;display:block;width:38px;line-height:13px;} #metrics-tabs a:hover {text-decoration:none;} + #metrics-block .metrics-views {background:#428bca;} #metrics-block .metrics-downloads {background:#5cb85c;} #metrics-block .metrics-citations {background:#c55b28;} #metrics-block .metrics-shares {background:#f0ad4e;} +-- */ /* -------- SHARRRE -------- */ #sharrre-block a {display:block; float:left; padding:6px 12px; margin-right:1em; background:#6f5499;} From 499e6be84a531b9356315ac28e32d8f53f152601 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Thu, 5 Jan 2017 16:40:39 -0500 Subject: [PATCH 6/7] add :MetricsUrl config option #3538 --- doc/sphinx-guides/source/installation/config.rst | 7 +++++++ .../harvard/iq/dataverse/settings/SettingsServiceBean.java | 5 +++++ .../java/edu/harvard/iq/dataverse/util/SystemConfig.java | 6 ++++++ src/main/webapp/dataverse.xhtml | 4 ++-- 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/doc/sphinx-guides/source/installation/config.rst b/doc/sphinx-guides/source/installation/config.rst index 230e87808b7..1193d615ae0 100644 --- a/doc/sphinx-guides/source/installation/config.rst +++ b/doc/sphinx-guides/source/installation/config.rst @@ -345,6 +345,13 @@ Set ``GuidesBaseUrl`` to override the default value "http://guides.dataverse.org ``curl -X PUT -d http://dataverse.example.edu http://localhost:8080/api/admin/settings/:GuidesBaseUrl`` +:MetricsUrl ++++++++++++ + +Make the metrics component on the root dataverse a clickable link to a website where you present metrics on your Dataverse installation. This could perhaps be an installation of https://github.com/IQSS/miniverse or any site. + +``curl -X PUT -d http://metrics.dataverse.example.edu http://localhost:8080/api/admin/settings/:MetricsUrl`` + :StatusMessageHeader ++++++++++++++++++++ diff --git a/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java index 4b8e6a85a10..67ee7adf2ef 100644 --- a/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java @@ -152,6 +152,11 @@ public enum Key { TwoRavensUrl, /** Optionally override http://guides.dataverse.org . */ GuidesBaseUrl, + /** + * A link to an installation of https://github.com/IQSS/miniverse or + * some other metrics app. + */ + MetricsUrl, /* zip download size limit */ ZipDownloadLimit, /* zip upload number of files limit */ diff --git a/src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java b/src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java index 831554565eb..3e990588d07 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java @@ -310,6 +310,12 @@ private String getGuidesLanguage() { return saneDefault; } + public String getMetricsUrl() { + String saneDefault = null; + String metricsUrl = settingsService.getValueForKey(SettingsServiceBean.Key.MetricsUrl, saneDefault); + return metricsUrl; + } + /** * Download-as-zip size limit. * returns 0 if not specified; diff --git a/src/main/webapp/dataverse.xhtml b/src/main/webapp/dataverse.xhtml index a68f27dfa33..1eebcb9f3fe 100644 --- a/src/main/webapp/dataverse.xhtml +++ b/src/main/webapp/dataverse.xhtml @@ -498,10 +498,10 @@
    - + #{bundle['metrics.title']} - + #{bundle['metrics.title']}
    From 80f1ae45ff75fc8e92a4629f30e3acc60dd38305 Mon Sep 17 00:00:00 2001 From: Michael Heppler Date: Fri, 6 Jan 2017 12:41:48 -0500 Subject: [PATCH 7/7] Changed background, color, padding, width of the Metrics block. [ref #3538] --- src/main/webapp/dataset.xhtml | 2 +- src/main/webapp/dataverse.xhtml | 2 +- src/main/webapp/file.xhtml | 2 +- src/main/webapp/resources/css/structure.css | 8 ++++---- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/webapp/dataset.xhtml b/src/main/webapp/dataset.xhtml index 8b2c39e6d54..b7f0584c0d7 100755 --- a/src/main/webapp/dataset.xhtml +++ b/src/main/webapp/dataset.xhtml @@ -40,7 +40,7 @@
    -
    +
    #{bundle['metrics.title']}
    diff --git a/src/main/webapp/dataverse.xhtml b/src/main/webapp/dataverse.xhtml index 1eebcb9f3fe..85077ac3333 100644 --- a/src/main/webapp/dataverse.xhtml +++ b/src/main/webapp/dataverse.xhtml @@ -496,7 +496,7 @@ -
    +
    #{bundle['metrics.title']} diff --git a/src/main/webapp/file.xhtml b/src/main/webapp/file.xhtml index 7f1af6e0160..4c63bcada30 100644 --- a/src/main/webapp/file.xhtml +++ b/src/main/webapp/file.xhtml @@ -29,7 +29,7 @@
    -
    +
    #{bundle['metrics.title']}
    diff --git a/src/main/webapp/resources/css/structure.css b/src/main/webapp/resources/css/structure.css index ae6eb71235d..bd0f49a0309 100644 --- a/src/main/webapp/resources/css/structure.css +++ b/src/main/webapp/resources/css/structure.css @@ -540,12 +540,12 @@ div.ui-tabs-panels .ui-tabs.ui-tabs-top .ui-tabs-nav.ui-widget-header {border-bo div[id$='roleDisplay'] span.label, div[id$='roleDetails'] span.label {display:inline-block; margin-bottom:4px;} /* -------- METRICS -------- */ -#metrics-block.col-xs-4 {border:1px solid #6f5499;background:#6f5499;padding:0;} -#metrics-label {color:#fff;} -#metrics-label a {color:#fff;display:block;} +#metrics-block.col-xs-3 {border:1px solid #eee;padding:0;} +#metrics-label {color:#333;background:#eee;padding:8px 10px;} +#metrics-label a {color:#333;display:block;} #metrics-label a:hover {text-decoration:none;} #metrics-label span.metrics-label-text {} -#metrics-content {color:#6f5499;background:#fff;} +#metrics-content {color:#333;background:#fff;padding:8px 10px;} /* -- #metrics-tabs a {background:#428bca;display:block;width:38px;line-height:13px;} #metrics-tabs a:hover {text-decoration:none;}