@@ -259,7 +259,7 @@
-->
@@ -314,7 +314,7 @@
+ rendered="#{!subdsf.datasetFieldType.allowMultiples}" filter="#{(subdsf.datasetFieldType.controlledVocabularyValues.size() lt 10) ? 'false':'true'}" filterMatchMode="contains" >
@@ -332,7 +332,9 @@
-->
+ rendered="#{subdsf.datasetFieldType.allowMultiples}" label="#{bundle.select}" multiple="true"
+ filter="#{(subdsf.datasetFieldType.controlledVocabularyValues.size() lt 10) ? 'false':'true'}" filterMatchMode="contains"
+ showHeader="#{(subdsf.datasetFieldType.controlledVocabularyValues.size() lt 10) ? 'false':'true'}">
diff --git a/src/main/webapp/resources/css/structure.css b/src/main/webapp/resources/css/structure.css
index fefcfeb8e74..a2c0f79e4fb 100644
--- a/src/main/webapp/resources/css/structure.css
+++ b/src/main/webapp/resources/css/structure.css
@@ -49,7 +49,7 @@ body .ui-widget {font-size: inherit;}
#status-alert {margin-top:0; margin-bottom:0;}
#status-alert div.alert {border:0; box-shadow:none;}
-#footer {position:absolute; bottom:0; width:100%; height:60px; padding-bottom:100px; color:#767676;}
+footer {position:absolute; bottom:0; width:100%; height:60px; padding-bottom:100px; color:#767676;}
#dvfooter.widget-view {position:fixed; left:0; bottom:0; margin:0; padding:4px 0 0 0; min-height:44p; height:auto; background:#fff;}
#dvfooter .poweredbylogo {text-align:right;}
#dvfooter .poweredbylogo span {font-size:.85em;margin-right:.3em;}
@@ -1114,4 +1114,4 @@ span.label-default { background-color: #757575 }
.dropdown-header { color:#757575 }
.login-container h1 { font-size:30px; }
-#embargoInputs label { font-weight: normal; }
\ No newline at end of file
+#embargoInputs label { font-weight: normal; }
diff --git a/src/test/java/edu/harvard/iq/dataverse/api/SwordIT.java b/src/test/java/edu/harvard/iq/dataverse/api/SwordIT.java
index ea6709cb915..29173d3bd76 100644
--- a/src/test/java/edu/harvard/iq/dataverse/api/SwordIT.java
+++ b/src/test/java/edu/harvard/iq/dataverse/api/SwordIT.java
@@ -5,6 +5,9 @@
import com.jayway.restassured.response.Response;
import edu.harvard.iq.dataverse.GlobalId;
import edu.harvard.iq.dataverse.api.datadeposit.SwordConfigurationImpl;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
@@ -195,6 +198,13 @@ public void testCreateDataverseCreateDatasetUploadFileDownloadFileEditTitle() {
String persistentId = UtilIT.getDatasetPersistentIdFromSwordResponse(createDatasetResponse);
logger.info("persistent id: " + persistentId);
+ Response getJson = UtilIT.nativeGetUsingPersistentId(persistentId, apiToken);
+ getJson.prettyPrint();
+ getJson.then().assertThat()
+ .statusCode(OK.getStatusCode())
+ .body("data.latestVersion.license.name", equalTo("CC0 1.0"))
+ .body("data.latestVersion.license.uri", equalTo("http://creativecommons.org/publicdomain/zero/1.0"));
+
Response atomEntryUnAuth = UtilIT.getSwordAtomEntry(persistentId, apiTokenNoPrivs);
atomEntryUnAuth.prettyPrint();
atomEntryUnAuth.then().assertThat()
@@ -638,6 +648,107 @@ public void testCreateDatasetPublishDestroy() {
}
+
+ @Test
+ public void testLicenses() {
+
+ Response createUser = UtilIT.createRandomUser();
+ String username = UtilIT.getUsernameFromResponse(createUser);
+ String apiToken = UtilIT.getApiTokenFromResponse(createUser);
+
+ Response createDataverse = UtilIT.createRandomDataverse(apiToken);
+ createDataverse.prettyPrint();
+ createDataverse.then().assertThat()
+ .statusCode(CREATED.getStatusCode());
+ String dataverseAlias = UtilIT.getAliasFromResponse(createDataverse);
+
+ String title = "License to Kill";
+ String description = "Spies in 1989";
+ String license = "NONE";
+ Response failToCreateDataset1 = UtilIT.createDatasetViaSwordApi(dataverseAlias, title, description, license, apiToken);
+ failToCreateDataset1.prettyPrint();
+ // As of 5.10 and PR #7920, you cannot pass NONE as a license.
+ failToCreateDataset1.then().assertThat()
+ .statusCode(BAD_REQUEST.getStatusCode());
+
+ String rights = "Call me";
+ Response failToCreateDataset2 = UtilIT.createDatasetViaSwordApi(dataverseAlias, title, description, license, rights, apiToken);
+ failToCreateDataset2.prettyPrint();
+ // You can't pass both license and rights
+ failToCreateDataset2.then().assertThat()
+ .statusCode(BAD_REQUEST.getStatusCode());
+
+ license = "CC0 1.0";
+ Response createDataset = UtilIT.createDatasetViaSwordApi(dataverseAlias, title, description, license, apiToken);
+ createDataset.prettyPrint();
+ createDataset.then().assertThat()
+ .statusCode(CREATED.getStatusCode());
+
+ String persistentId = UtilIT.getDatasetPersistentIdFromSwordResponse(createDataset);
+
+ Response getJson = UtilIT.nativeGetUsingPersistentId(persistentId, apiToken);
+ getJson.prettyPrint();
+ getJson.then().assertThat()
+ .statusCode(OK.getStatusCode())
+ .body("data.latestVersion.license.name", equalTo("CC0 1.0"))
+ .body("data.latestVersion.license.uri", equalTo("http://creativecommons.org/publicdomain/zero/1.0"))
+ .body("data.latestVersion.termsOfUse", equalTo(null));
+ }
+
+ @Test
+ public void testCustomTerms() {
+
+ Response createUser = UtilIT.createRandomUser();
+ String username = UtilIT.getUsernameFromResponse(createUser);
+ String apiToken = UtilIT.getApiTokenFromResponse(createUser);
+
+ Response createDataverse = UtilIT.createRandomDataverse(apiToken);
+ createDataverse.prettyPrint();
+ createDataverse.then().assertThat()
+ .statusCode(CREATED.getStatusCode());
+ String dataverseAlias = UtilIT.getAliasFromResponse(createDataverse);
+
+ String title = "Terms of Endearment";
+ String description = "Aurora, etc.";
+ String license = null;
+ String rights = "Call me";
+ Response createDataset = UtilIT.createDatasetViaSwordApi(dataverseAlias, title, description, license, rights, apiToken);
+ createDataset.prettyPrint();
+ createDataset.then().assertThat()
+ .statusCode(CREATED.getStatusCode());
+
+ String persistentId = UtilIT.getDatasetPersistentIdFromSwordResponse(createDataset);
+
+ Response getJson = UtilIT.nativeGetUsingPersistentId(persistentId, apiToken);
+ getJson.prettyPrint();
+ getJson.then().assertThat()
+ .statusCode(OK.getStatusCode())
+ .body("data.latestVersion.termsOfUse", equalTo("Call me"))
+ .body("data.latestVersion.license", equalTo(null));
+ }
+
+ @Test
+ public void testXmlExampleInGuides() throws IOException {
+
+ Response createUser = UtilIT.createRandomUser();
+ String username = UtilIT.getUsernameFromResponse(createUser);
+ String apiToken = UtilIT.getApiTokenFromResponse(createUser);
+
+ Response createDataverse = UtilIT.createRandomDataverse(apiToken);
+ createDataverse.prettyPrint();
+ createDataverse.then().assertThat()
+ .statusCode(CREATED.getStatusCode());
+ String dataverseAlias = UtilIT.getAliasFromResponse(createDataverse);
+
+ File exampleFile = new File("doc/sphinx-guides/source/api/sword-atom-entry.xml");
+ String xmlIn = new String(java.nio.file.Files.readAllBytes(Paths.get(exampleFile.getAbsolutePath())));
+ Response createDataset = UtilIT.createDatasetViaSwordApiFromXML(dataverseAlias, xmlIn, apiToken);
+ createDataset.prettyPrint();
+ createDataset.then().assertThat()
+ .statusCode(CREATED.getStatusCode());
+
+ }
+
/**
* This test requires the root dataverse to have been published already.
*
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 23672c45916..7b9b5f3b129 100644
--- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java
+++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java
@@ -436,7 +436,18 @@ static Response createDatasetViaSwordApi(String dataverseToCreateDatasetIn, Stri
return createDatasetViaSwordApiFromXML(dataverseToCreateDatasetIn, xmlIn, apiToken);
}
- private static Response createDatasetViaSwordApiFromXML(String dataverseToCreateDatasetIn, String xmlIn, String apiToken) {
+ static Response createDatasetViaSwordApi(String dataverseToCreateDatasetIn, String title, String description, String license, String apiToken) {
+ String nullRights = null;
+ String xmlIn = getDatasetXml(title, "Lastname, Firstname", description, license, nullRights);
+ return createDatasetViaSwordApiFromXML(dataverseToCreateDatasetIn, xmlIn, apiToken);
+ }
+
+ static Response createDatasetViaSwordApi(String dataverseToCreateDatasetIn, String title, String description, String license, String rights, String apiToken) {
+ String xmlIn = getDatasetXml(title, "Lastname, Firstname", description, license, rights);
+ return createDatasetViaSwordApiFromXML(dataverseToCreateDatasetIn, xmlIn, apiToken);
+ }
+
+ public static Response createDatasetViaSwordApiFromXML(String dataverseToCreateDatasetIn, String xmlIn, String apiToken) {
Response createDatasetResponse = given()
.auth().basic(apiToken, EMPTY_STRING)
.body(xmlIn)
@@ -534,11 +545,27 @@ static Response loadMetadataBlock(String apiToken, byte[] body) {
}
static private String getDatasetXml(String title, String author, String description) {
+ String nullLicense = null;
+ String nullRights = null;
+ return getDatasetXml(title, author, description, nullLicense, nullRights);
+ }
+
+ static private String getDatasetXml(String title, String author, String description, String license, String rights) {
+ String optionalLicense = "";
+ if (license != null) {
+ optionalLicense = "
" + license + "\n";
+ }
+ String optionalRights = "";
+ if (rights != null) {
+ optionalRights = "
" + rights + "\n";
+ }
String xmlIn = "\n"
+ "
\n"
+ " " + title + "\n"
+ " " + author + "\n"
+ " " + description + "\n"
+ + optionalLicense
+ + optionalRights
+ "\n"
+ "";
return xmlIn;
diff --git a/src/test/java/edu/harvard/iq/dataverse/export/DDIExporterTest.java b/src/test/java/edu/harvard/iq/dataverse/export/DDIExporterTest.java
index 8ce823eb600..c9446d7c414 100644
--- a/src/test/java/edu/harvard/iq/dataverse/export/DDIExporterTest.java
+++ b/src/test/java/edu/harvard/iq/dataverse/export/DDIExporterTest.java
@@ -1,6 +1,10 @@
package edu.harvard.iq.dataverse.export;
import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
import edu.harvard.iq.dataverse.ControlledVocabularyValue;
import edu.harvard.iq.dataverse.DatasetFieldType;
import edu.harvard.iq.dataverse.DatasetFieldType.FieldType;
@@ -17,10 +21,15 @@
import java.io.File;
import java.io.IOException;
import java.io.StringReader;
+import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
@@ -42,7 +51,10 @@ public class DDIExporterTest {
private static final SettingsServiceBean settingsService = Mockito.mock(SettingsServiceBean.class);
private static final LicenseServiceBean licenseService = Mockito.mock(LicenseServiceBean.class);
private static final MockDatasetFieldSvc datasetFieldTypeSvc = new MockDatasetFieldSvc();
- private static final Gson gson = new Gson();
+ private static final Gson gson = new GsonBuilder().registerTypeAdapter(LocalDate.class, (JsonDeserializer
) (JsonElement json, Type type, JsonDeserializationContext jsonDeserializationContext) -> {
+ Instant instant = Instant.ofEpochMilli(json.getAsJsonPrimitive().getAsLong());
+ return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
+ }).create();
/*
* Setup and teardown mocks for BrandingUtil for atomicity.