From 4d5813f7f9dc0bd07a2d60725c8535de99661add Mon Sep 17 00:00:00 2001 From: Akos Kukucska Date: Thu, 4 Sep 2025 14:52:09 +0200 Subject: [PATCH 1/6] Add metadatalanguage to Dataset and DatasetFacade, and test it --- .../dataverse/http/DatasetOperationsTest.java | 27 ++++-- .../dataverse/entities/Dataset.java | 1 + .../entities/facade/DatasetBuilder.java | 4 + .../entities/facade/DatasetFacade.java | 1 + .../entities/facade/DatasetTestFactory.java | 86 +++++++++++-------- 5 files changed, 73 insertions(+), 46 deletions(-) diff --git a/src/integration-test/java/com/researchspace/dataverse/http/DatasetOperationsTest.java b/src/integration-test/java/com/researchspace/dataverse/http/DatasetOperationsTest.java index bfbb43b..9c66e94 100644 --- a/src/integration-test/java/com/researchspace/dataverse/http/DatasetOperationsTest.java +++ b/src/integration-test/java/com/researchspace/dataverse/http/DatasetOperationsTest.java @@ -20,6 +20,7 @@ import java.util.List; import static com.researchspace.dataverse.entities.facade.DatasetTestFactory.createFacade; +import static com.researchspace.dataverse.entities.facade.DatasetTestFactory.createFacadeWithMetadataLanguage; import static org.junit.Assert.*; @@ -38,14 +39,14 @@ See the License for the specific language governing permissions and limitations under the License. -*/ + */ public class DatasetOperationsTest extends AbstractIntegrationTest { - + @Before public void setup() throws Exception { super.setUp(); - } + } File exampleDatasetJson = new File("src/integration-test/resources/dataset-create-new-all-default-fields.json"); @Test @@ -117,9 +118,9 @@ public void testPostGetDeleteDataset() throws IOException, InterruptedException, DatasetFacade facade = createFacade(); //create a new, unpublished Dataverse String newAlias = RandomStringUtils.randomAlphabetic(10); - DataversePost toCreate = DataverseOperationsTest.createADataverse(newAlias); - DataversePost newDV = dataverseOps.createNewDataverse(dataverseAlias, toCreate).getData(); - + DataversePost toCreate = DataverseOperationsTest.createADataverse(newAlias); + DataversePost newDV = dataverseOps.createNewDataverse(dataverseAlias, toCreate).getData(); + // create Dataset in child dataverse Identifier datasetId = dataverseOps.createDataset(facade, newDV.getAlias()); assertNotNull(datasetId.getId()); @@ -127,12 +128,12 @@ public void testPostGetDeleteDataset() throws IOException, InterruptedException, Dataset ds = datasetOps.getDataset(datasetId); String doiId = ds.getDoiId().get(); datasetOps.uploadFile(doiId, getTestFile()); - + //publishing will fail, as parent DV is not published DataverseResponse response = datasetOps.publishDataset (datasetId, Version.MAJOR); assertNull(response.getData()); assertNotNull(response.getMessage()); - + facade.setTitle("Updated title2"); datasetOps.updateDataset(facade, datasetId); List versions = datasetOps.getDatasetVersions(datasetId); @@ -141,7 +142,15 @@ public void testPostGetDeleteDataset() throws IOException, InterruptedException, String msg = datasetOps.deleteDataset(datasetId).getMessage(); dataverseOps.deleteDataverse(newAlias); assertNotNull(msg); - + + } + + @Test + public void testCreateDatasetWithMetadataLanguage() { + DatasetFacade facade = createFacadeWithMetadataLanguage(); + Identifier datasetId = dataverseOps.createDataset(facade, dataverseAlias); + assertNotNull(datasetId.getId()); + assertNotNull(datasetId.getPersistentId()); } private File getTestFile() { diff --git a/src/main/java/com/researchspace/dataverse/entities/Dataset.java b/src/main/java/com/researchspace/dataverse/entities/Dataset.java index abdd52f..60cf0ee 100644 --- a/src/main/java/com/researchspace/dataverse/entities/Dataset.java +++ b/src/main/java/com/researchspace/dataverse/entities/Dataset.java @@ -33,6 +33,7 @@ public class Dataset { private Long id; private String identifier, protocol, authority; private URL persistentUrl; + private String metadataLanguage; /** * Getter for the DOI String used to identify a dataset for SWORD upload diff --git a/src/main/java/com/researchspace/dataverse/entities/facade/DatasetBuilder.java b/src/main/java/com/researchspace/dataverse/entities/facade/DatasetBuilder.java index 52d6ae5..b3b6524 100644 --- a/src/main/java/com/researchspace/dataverse/entities/facade/DatasetBuilder.java +++ b/src/main/java/com/researchspace/dataverse/entities/facade/DatasetBuilder.java @@ -84,6 +84,10 @@ public Dataset build(DatasetFacade facade) { citation.setFields(fields); Dataset toSubmit = new Dataset(); toSubmit.setDatasetVersion(dv); + String metadataLanguage = facade.getMetadataLanguage(); + if (metadataLanguage != null) { + toSubmit.setMetadataLanguage(facade.getMetadataLanguage()); + } return toSubmit; } diff --git a/src/main/java/com/researchspace/dataverse/entities/facade/DatasetFacade.java b/src/main/java/com/researchspace/dataverse/entities/facade/DatasetFacade.java index baae94c..bb7f0ce 100644 --- a/src/main/java/com/researchspace/dataverse/entities/facade/DatasetFacade.java +++ b/src/main/java/com/researchspace/dataverse/entities/facade/DatasetFacade.java @@ -50,6 +50,7 @@ public class DatasetFacade { private Date productionDate; private String productionPlace; private @Singular List contributors; + private String metadataLanguage; /** * Returns a copy if the internally stored Date diff --git a/src/test/java/com/researchspace/dataverse/entities/facade/DatasetTestFactory.java b/src/test/java/com/researchspace/dataverse/entities/facade/DatasetTestFactory.java index af45915..2e77777 100644 --- a/src/test/java/com/researchspace/dataverse/entities/facade/DatasetTestFactory.java +++ b/src/test/java/com/researchspace/dataverse/entities/facade/DatasetTestFactory.java @@ -34,32 +34,44 @@ public class DatasetTestFactory { * Creates a complex DataSet object * @return * @throws MalformedURLException - * @throws URISyntaxException + * @throws URISyntaxException */ - public static DatasetFacade createFacade() throws MalformedURLException, URISyntaxException { + public static DatasetFacade createFacade() throws MalformedURLException, URISyntaxException { return DatasetFacade.builder() - .author(buildAnAuthor()).author(buildAnotherAuthor()) - .title("title1") - .contact(buildAContact()).contact(buildAnotherContact()) - .description(buildADesc()) - .keyword(buildAKeyword("key1")).keyword(buildAKeyword("key2")) - .topicClassification(buildATopicClassification("topic1")) - .publication(buildAPublication()) - .producer(buildAProducer()) - .productionDate(new Date()) - .productionPlace("Edinburgh, UK") - .contributor(buildAContributor("Fred")).contributor(buildAContributor("Tim")) - .subject("Chemistry") - .depositor("A depositor") - .subtitle(" A subtitle") - .alternativeTitle("altTitle") - .alternativeURL(new URL("https://www.myrepo.com")) - .note("Some note") - .languages(Arrays.asList(new String []{"English", "French"})) - .build(); + .author(buildAnAuthor()).author(buildAnotherAuthor()) + .title("title1") + .contact(buildAContact()).contact(buildAnotherContact()) + .description(buildADesc()) + .keyword(buildAKeyword("key1")).keyword(buildAKeyword("key2")) + .topicClassification(buildATopicClassification("topic1")) + .publication(buildAPublication()) + .producer(buildAProducer()) + .productionDate(new Date()) + .productionPlace("Edinburgh, UK") + .contributor(buildAContributor("Fred")).contributor(buildAContributor("Tim")) + .subject("Chemistry") + .depositor("A depositor") + .subtitle(" A subtitle") + .alternativeTitle("altTitle") + .alternativeURL(new URL("https://www.myrepo.com")) + .note("Some note") + .languages(Arrays.asList(new String[] { "English", "French" })) + .build(); } - private static DatasetContributor buildAContributor(String name) { + public static DatasetFacade createFacadeWithMetadataLanguage() { + return DatasetFacade.builder() + .author(buildAnAuthor()) + .title("test") + .metadataLanguage("hu") + .description(buildADesc()) + .subject("Chemistry") + .languages(Arrays.asList(new String[] { "English", "French" })) + .depositor("A depositor") + .build(); + } + + private static DatasetContributor buildAContributor(String name) { return DatasetContributor.builder() .name(name) .type(ContributorType.ProjectLeader) @@ -92,14 +104,14 @@ private static DatasetTopicClassification buildATopicClassification(String value } private static DatasetKeyword buildAKeyword(String key) throws URISyntaxException { - return DatasetKeyword.builder().value(key).vocabulary("keywordVocab") - .vocabularyURI(new URI("https://vocab.com")).build(); + return DatasetKeyword.builder().value(key).vocabulary("keywordVocab") + .vocabularyURI(new URI("https://vocab.com")).build(); } private static DatasetDescription buildADesc() { - return DatasetDescription.builder() - .date(new Date()).description("some desc") - .build(); + return DatasetDescription.builder() + .date(new Date()).description("some desc") + .build(); } static DatasetContact buildAContact() { @@ -107,8 +119,8 @@ static DatasetContact buildAContact() { .datasetContactAffiliation("Some place").datasetContactEmail("contact@email.com").datasetContactName("Sarah Contact") .build(); } - - static DatasetContact buildAnotherContact() { + + static DatasetContact buildAnotherContact() { return DatasetContact.builder() .datasetContactAffiliation("Another place") .datasetContactEmail("contact2@email.com") @@ -116,18 +128,18 @@ static DatasetContact buildAnotherContact() { .build(); } - static DatasetAuthor buildAnotherAuthor() { + static DatasetAuthor buildAnotherAuthor() { return DatasetAuthor.builder().authorName("John Smith") - .authorAffiliation("Dataverse") - .authorIdentifierScheme("ISNI") - .authorIdentifier("1234-5678").build(); + .authorAffiliation("Dataverse") + .authorIdentifierScheme("ISNI") + .authorIdentifier("1234-5678").build(); } - static DatasetAuthor buildAnAuthor() { + static DatasetAuthor buildAnAuthor() { return DatasetAuthor.builder().authorName("Fred Blogs") - .authorAffiliation("RSpace") - .authorIdentifierScheme("ORCID") - .authorIdentifier("1234-5678").build(); + .authorAffiliation("RSpace") + .authorIdentifierScheme("ORCID") + .authorIdentifier("1234-5678").build(); } } From 8d323074a4e78b4c2f5546c30039245868c1c339 Mon Sep 17 00:00:00 2001 From: Akos Kukucska Date: Fri, 5 Sep 2025 12:27:15 +0200 Subject: [PATCH 2/6] Upload files with protocols other than DOI --- .../dataverse/http/DatasetOperationsTest.java | 10 +++++++++- .../dataverse/api/v1/DatasetOperations.java | 4 ++-- .../com/researchspace/dataverse/entities/Dataset.java | 2 +- .../dataverse/http/DataverseOperationsImplV1.java | 10 +++++----- .../researchspace/dataverse/sword/FileUploader.java | 11 ++++++----- .../dataverse/entities/facade/DatasetTestFactory.java | 1 + 6 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/integration-test/java/com/researchspace/dataverse/http/DatasetOperationsTest.java b/src/integration-test/java/com/researchspace/dataverse/http/DatasetOperationsTest.java index 9c66e94..80d69b7 100644 --- a/src/integration-test/java/com/researchspace/dataverse/http/DatasetOperationsTest.java +++ b/src/integration-test/java/com/researchspace/dataverse/http/DatasetOperationsTest.java @@ -127,7 +127,7 @@ public void testPostGetDeleteDataset() throws IOException, InterruptedException, assertNotNull(datasetId.getPersistentId()); Dataset ds = datasetOps.getDataset(datasetId); String doiId = ds.getDoiId().get(); - datasetOps.uploadFile(doiId, getTestFile()); + datasetOps.uploadFile(doiId, getTestFile(), ds.getProtocol()); //publishing will fail, as parent DV is not published DataverseResponse response = datasetOps.publishDataset (datasetId, Version.MAJOR); @@ -153,6 +153,14 @@ public void testCreateDatasetWithMetadataLanguage() { assertNotNull(datasetId.getPersistentId()); } + @Test + public void testUploadFile() { + DatasetFacade facade = createFacadeWithMetadataLanguage(); + Identifier datasetId = dataverseOps.createDataset(facade, dataverseAlias); + Dataset ds = datasetOps.getDataset(datasetId); + datasetOps.uploadFile(ds.getDoiId().get(), getTestFile(), ds.getProtocol()); + } + private File getTestFile() { return new File("src/integration-test/resources/ResizablePng.zip"); } diff --git a/src/main/java/com/researchspace/dataverse/api/v1/DatasetOperations.java b/src/main/java/com/researchspace/dataverse/api/v1/DatasetOperations.java index 48dabee..f40e5af 100644 --- a/src/main/java/com/researchspace/dataverse/api/v1/DatasetOperations.java +++ b/src/main/java/com/researchspace/dataverse/api/v1/DatasetOperations.java @@ -83,7 +83,7 @@ DatasetFileList uploadNativeFile(InputStream data, long contentLength, FileUploa * @param doi The DOI of the Dataset * @param file The file to add to the DataSet */ - void uploadFile(String doi, File file); + void uploadFile(String doi, File file, String protocol); /** * Uploads a file using a data stream. @@ -92,7 +92,7 @@ DatasetFileList uploadNativeFile(InputStream data, long contentLength, FileUploa * @param inputStream Stream of data to upload as a file in Dataverse. * @param filename Contents of the field "name" that will appear as in Dataverse. */ - void uploadFile(String doi, InputStream inputStream, String filename); + void uploadFile(String doi, InputStream inputStream, String filename, String protocol); /** * Deletes a {@link Dataset} diff --git a/src/main/java/com/researchspace/dataverse/entities/Dataset.java b/src/main/java/com/researchspace/dataverse/entities/Dataset.java index 60cf0ee..c8c722f 100644 --- a/src/main/java/com/researchspace/dataverse/entities/Dataset.java +++ b/src/main/java/com/researchspace/dataverse/entities/Dataset.java @@ -36,7 +36,7 @@ public class Dataset { private String metadataLanguage; /** - * Getter for the DOI String used to identify a dataset for SWORD upload + * Getter for the DOI String or other persistent identifier used to identify a dataset for SWORD upload * @return an {@link Optional}. Will be null if persistentURL is not set. */ public Optional getDoiId (){ diff --git a/src/main/java/com/researchspace/dataverse/http/DataverseOperationsImplV1.java b/src/main/java/com/researchspace/dataverse/http/DataverseOperationsImplV1.java index a5fd29e..6f0f53f 100644 --- a/src/main/java/com/researchspace/dataverse/http/DataverseOperationsImplV1.java +++ b/src/main/java/com/researchspace/dataverse/http/DataverseOperationsImplV1.java @@ -236,21 +236,21 @@ private DatasetFileList getDatasetFileList(FileUploadMetadata metadata, Identifi * @see com.researchspace.dataverse.http.DataverseAPI#uploadFile(java.lang.String, java.io.File) */ @Override - public void uploadFile (String doi, File file) { + public void uploadFile (String doi, File file, String protocol) { try { - this.uploadFile(doi, new FileInputStream(file), file.getName()); + this.uploadFile(doi, new FileInputStream(file), file.getName(), protocol); } catch (FileNotFoundException e) { e.printStackTrace(); } } @Override - public void uploadFile(String doi, InputStream file, String filename) { + public void uploadFile(String doi, InputStream file, String filename, String protocol) { FileUploader uploader = new FileUploader(); try { - uploader.deposit(file, filename, apiKey, new URI(serverURL), doi); + uploader.deposit(file, filename, apiKey, new URI(serverURL), doi, protocol); } catch (IOException | SWORDClientException | ProtocolViolationException | URISyntaxException e) { - log.error("Couldn't upload file {} with doi {} : {}", filename, doi.toString(), e.getMessage()); + log.error("Couldn't upload file {} with {} {} : {}", filename, protocol, doi.toString(), e.getMessage()); throw new RestClientException(e.getMessage()); } catch (SWORDError error) { if (!StringUtils.isEmpty(error.getErrorBody())) { diff --git a/src/main/java/com/researchspace/dataverse/sword/FileUploader.java b/src/main/java/com/researchspace/dataverse/sword/FileUploader.java index 4293ffd..fe6c053 100644 --- a/src/main/java/com/researchspace/dataverse/sword/FileUploader.java +++ b/src/main/java/com/researchspace/dataverse/sword/FileUploader.java @@ -56,9 +56,9 @@ public class FileUploader { * @throws SWORDError * @throws ProtocolViolationException */ - public DepositReceipt deposit(File file, String apiKey, URI dataverseServer, String doi) + public DepositReceipt deposit(File file, String apiKey, URI dataverseServer, String doi, String protocol) throws IOException, SWORDClientException, SWORDError, ProtocolViolationException { - return this.deposit(new FileInputStream(file), file.getName(), apiKey, dataverseServer, doi); + return this.deposit(new FileInputStream(file), file.getName(), apiKey, dataverseServer, doi, protocol); } @@ -70,13 +70,14 @@ public DepositReceipt deposit(File file, String apiKey, URI dataverseServer, Str * @param apiKey Key used to authenticate actions into the goal dataverse instance. * @param dataverseServer URL of the dataverse instance to attack. * @param doi To identify the dataset that is the goal of the file upload. + * @param protocol The protocol used for persistent identification * @return Information of the result of the upload via a {@code DepositReceipt} instance. * @throws IOException Thrown when a IO error occurs, which is a general error. * @throws SWORDClientException Thrown when an exception happens inside the SWORD client. * @throws SWORDError Thrown when an exception happens inside the SWORD client. * @throws ProtocolViolationException Thrown for unknown reasons. */ - public DepositReceipt deposit(InputStream is, String filename, String apiKey, URI dataverseServer, String doi) + public DepositReceipt deposit(InputStream is, String filename, String apiKey, URI dataverseServer, String doi, String protocol) throws IOException, SWORDClientException, SWORDError, ProtocolViolationException { SWORDClient cli = new SWORDClient(); Deposit dep = new Deposit(); @@ -87,8 +88,8 @@ public DepositReceipt deposit(InputStream is, String filename, String apiKey, UR AuthCredentials cred = new AuthCredentials(apiKey, ""); - String depositURI = dataverseServer.toString() + "/dvn/api/data-deposit/v1.1/swordv2/edit-media/study/doi:" - + doi; + String depositURI = dataverseServer.toString() + "/dvn/api/data-deposit/v1.1/swordv2/edit-media/study/" + + protocol + ":" + doi; DepositReceipt rct = cli.deposit(depositURI, dep, cred); log.info("Deposit received with status {}" ,rct.getStatusCode()); return rct; diff --git a/src/test/java/com/researchspace/dataverse/entities/facade/DatasetTestFactory.java b/src/test/java/com/researchspace/dataverse/entities/facade/DatasetTestFactory.java index 2e77777..77f6ece 100644 --- a/src/test/java/com/researchspace/dataverse/entities/facade/DatasetTestFactory.java +++ b/src/test/java/com/researchspace/dataverse/entities/facade/DatasetTestFactory.java @@ -68,6 +68,7 @@ public static DatasetFacade createFacadeWithMetadataLanguage() { .subject("Chemistry") .languages(Arrays.asList(new String[] { "English", "French" })) .depositor("A depositor") + .contact(buildAContact()) .build(); } From 0180ca878303227c1c9b5fabf5ab21a695a7b495 Mon Sep 17 00:00:00 2001 From: Akos Kukucska Date: Wed, 1 Oct 2025 14:08:11 +0200 Subject: [PATCH 3/6] New DataverseOperation for querying metadata language. --- .../dataverse/http/DataverseOperationsTest.java | 10 ++++++++++ .../dataverse/api/v1/DataverseOperations.java | 3 +++ .../http/DataverseOperationsImplV1.java | 16 +++++++++++++++- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/integration-test/java/com/researchspace/dataverse/http/DataverseOperationsTest.java b/src/integration-test/java/com/researchspace/dataverse/http/DataverseOperationsTest.java index 64e7e52..e67ece8 100644 --- a/src/integration-test/java/com/researchspace/dataverse/http/DataverseOperationsTest.java +++ b/src/integration-test/java/com/researchspace/dataverse/http/DataverseOperationsTest.java @@ -11,6 +11,8 @@ import org.junit.Test; import java.util.Arrays; +import java.util.List; +import java.util.Map; import static org.junit.Assert.*; /**
@@ -93,4 +95,12 @@ public void testGetDataverseById() {
 		assertNotNull(dv.getId());
 		assertTrue(dv.getContactEmails().size() > 0);
 	}
+
+	@Test
+	public void testGetDatasetMetadataLanguage() {
+		// only works if dataverseAlias belongs to a dataverse collection with enlish as its metadatalanguage
+		DataverseResponse>> langMap = dataverseOps
+				.getDataverseMetadataLanguage(dataverseAlias);
+		assertEquals("en", langMap.getData().get(0).get("locale"));
+	}
 }
diff --git a/src/main/java/com/researchspace/dataverse/api/v1/DataverseOperations.java b/src/main/java/com/researchspace/dataverse/api/v1/DataverseOperations.java
index 6c4a31d..fb21d37 100644
--- a/src/main/java/com/researchspace/dataverse/api/v1/DataverseOperations.java
+++ b/src/main/java/com/researchspace/dataverse/api/v1/DataverseOperations.java
@@ -5,6 +5,7 @@
 
 import java.io.IOException;
 import java.util.List;
+import java.util.Map;
 
 import com.researchspace.dataverse.entities.DataversePost;
 import com.researchspace.dataverse.entities.DataverseGet;
@@ -87,4 +88,6 @@ public interface DataverseOperations {
 	 */
 	DataverseResponse publishDataverse(String dataverseAlias);
 
+	DataverseResponse>> getDataverseMetadataLanguage(String alias);
+
 }
diff --git a/src/main/java/com/researchspace/dataverse/http/DataverseOperationsImplV1.java b/src/main/java/com/researchspace/dataverse/http/DataverseOperationsImplV1.java
index a5fd29e..5dba9ae 100644
--- a/src/main/java/com/researchspace/dataverse/http/DataverseOperationsImplV1.java
+++ b/src/main/java/com/researchspace/dataverse/http/DataverseOperationsImplV1.java
@@ -33,6 +33,7 @@
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.List;
+import java.util.Map;
 
 import static org.apache.commons.lang3.StringUtils.isEmpty;
 import static org.apache.commons.lang3.Validate.isTrue;
@@ -412,5 +413,18 @@ public DataverseResponse setDatasetPublishPopupCustomText(String text) {
 		ResponseEntity> resp = template.exchange(url, HttpMethod.PUT, entity, type);
 		log.debug(resp.getBody().toString());
 		return resp.getBody();
-	}	
+	}
+	
+	@Override
+	public DataverseResponse>> getDataverseMetadataLanguage(String alias) {
+		String url = createV1Url("dataverses", alias, "metadataLanguage");
+		HttpEntity entity = createHttpEntity("");
+		ParameterizedTypeReference>>> type = new ParameterizedTypeReference>>>() {
+		};
+		ResponseEntity>>> resp = template.exchange(url, HttpMethod.GET,
+				entity, type);
+		log.debug(resp.getBody().toString());
+		return resp.getBody();
+
+	}
 }

From 331559669ba95be7c769963e3a42b491c1cf0881 Mon Sep 17 00:00:00 2001
From: Akos Kukucska 
Date: Fri, 3 Oct 2025 10:52:27 +0200
Subject: [PATCH 4/6] Rename endpoint

---
 .../researchspace/dataverse/http/DataverseOperationsImplV1.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main/java/com/researchspace/dataverse/http/DataverseOperationsImplV1.java b/src/main/java/com/researchspace/dataverse/http/DataverseOperationsImplV1.java
index afbf816..47a9011 100644
--- a/src/main/java/com/researchspace/dataverse/http/DataverseOperationsImplV1.java
+++ b/src/main/java/com/researchspace/dataverse/http/DataverseOperationsImplV1.java
@@ -417,7 +417,7 @@ public DataverseResponse setDatasetPublishPopupCustomText(String text) {
 	
 	@Override
 	public DataverseResponse>> getDataverseMetadataLanguage(String alias) {
-		String url = createV1Url("dataverses", alias, "metadataLanguage");
+		String url = createV1Url("dataverses", alias, "allowedMetadataLanguages");
 		HttpEntity entity = createHttpEntity("");
 		ParameterizedTypeReference>>> type = new ParameterizedTypeReference>>>() {
 		};

From 2632d5e6bee26a6beb49b001df49a519a0853ed2 Mon Sep 17 00:00:00 2001
From: Akos Kukucska 
Date: Tue, 28 Oct 2025 13:40:32 +0100
Subject: [PATCH 5/6] Add a license when creating a dataset

---
 .../dataverse/http/DatasetOperationsTest.java    | 12 ++++++++++++
 .../dataverse/entities/DatasetVersion.java       |  4 +++-
 .../entities/facade/DatasetBuilder.java          |  4 ++++
 .../dataverse/entities/facade/DatasetFacade.java |  3 ++-
 .../dataverse/entities/facade/License.java       | 16 ++++++++++++++++
 5 files changed, 37 insertions(+), 2 deletions(-)
 create mode 100644 src/main/java/com/researchspace/dataverse/entities/facade/License.java

diff --git a/src/integration-test/java/com/researchspace/dataverse/http/DatasetOperationsTest.java b/src/integration-test/java/com/researchspace/dataverse/http/DatasetOperationsTest.java
index 80d69b7..981747d 100644
--- a/src/integration-test/java/com/researchspace/dataverse/http/DatasetOperationsTest.java
+++ b/src/integration-test/java/com/researchspace/dataverse/http/DatasetOperationsTest.java
@@ -5,6 +5,8 @@
 
 import com.researchspace.dataverse.entities.*;
 import com.researchspace.dataverse.entities.facade.DatasetFacade;
+import com.researchspace.dataverse.entities.facade.License;
+
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.RandomStringUtils;
 import org.junit.Before;
@@ -15,6 +17,7 @@
 import java.io.File;
 import java.io.IOException;
 import java.net.MalformedURLException;
+import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.Arrays;
 import java.util.List;
@@ -161,6 +164,15 @@ public void testUploadFile() {
 		datasetOps.uploadFile(ds.getDoiId().get(), getTestFile(), ds.getProtocol());
 	}
 
+	@Test
+	public void testCreateDatasetWithLicense() throws URISyntaxException {
+		DatasetFacade facade = createFacadeWithMetadataLanguage();
+		facade.setLicense(new License("CC0 1.0", new URI("http://creativecommons.org/publicdomain/zero/1.0")));
+		Identifier datasetId = dataverseOps.createDataset(facade, dataverseAlias);
+		Dataset ds = datasetOps.getDataset(datasetId);
+		assertEquals("CC0 1.0", ds.getLatestVersion().getLicense().getName());
+	}
+
 	private File getTestFile() {
 		return new File("src/integration-test/resources/ResizablePng.zip");
 	}
diff --git a/src/main/java/com/researchspace/dataverse/entities/DatasetVersion.java b/src/main/java/com/researchspace/dataverse/entities/DatasetVersion.java
index dc3acfc..44be764 100644
--- a/src/main/java/com/researchspace/dataverse/entities/DatasetVersion.java
+++ b/src/main/java/com/researchspace/dataverse/entities/DatasetVersion.java
@@ -5,6 +5,8 @@
 
 import java.util.Date;
 
+import com.researchspace.dataverse.entities.facade.License;
+
 import lombok.Data;
 /** 
 Copyright 2016 ResearchSpace
@@ -31,5 +33,5 @@ public class DatasetVersion {
 	private Date createTime;
 	private DataSetMetadataBlock metadataBlocks;
 	private int versionNumber, versionMinorNumber;
-
+	private License license;
 }
diff --git a/src/main/java/com/researchspace/dataverse/entities/facade/DatasetBuilder.java b/src/main/java/com/researchspace/dataverse/entities/facade/DatasetBuilder.java
index b3b6524..492381d 100644
--- a/src/main/java/com/researchspace/dataverse/entities/facade/DatasetBuilder.java
+++ b/src/main/java/com/researchspace/dataverse/entities/facade/DatasetBuilder.java
@@ -82,6 +82,10 @@ public Dataset build(DatasetFacade facade) {
 		dv.setMetadataBlocks(blocks);
 		blocks.setCitation(citation);
 		citation.setFields(fields);
+		License license = facade.getLicense();
+		if (license != null) {
+			dv.setLicense(license);
+		}
 		Dataset toSubmit = new Dataset();
 		toSubmit.setDatasetVersion(dv);
 		String metadataLanguage = facade.getMetadataLanguage();
diff --git a/src/main/java/com/researchspace/dataverse/entities/facade/DatasetFacade.java b/src/main/java/com/researchspace/dataverse/entities/facade/DatasetFacade.java
index bb7f0ce..faae9e6 100644
--- a/src/main/java/com/researchspace/dataverse/entities/facade/DatasetFacade.java
+++ b/src/main/java/com/researchspace/dataverse/entities/facade/DatasetFacade.java
@@ -51,7 +51,8 @@ public class DatasetFacade   {
 	private String productionPlace;
 	private @Singular List contributors;
 	private String metadataLanguage;
-	
+	private License license;
+
 	/**
 	 * Returns a copy if the internally stored Date
 	 * @return
diff --git a/src/main/java/com/researchspace/dataverse/entities/facade/License.java b/src/main/java/com/researchspace/dataverse/entities/facade/License.java
new file mode 100644
index 0000000..a64209b
--- /dev/null
+++ b/src/main/java/com/researchspace/dataverse/entities/facade/License.java
@@ -0,0 +1,16 @@
+package com.researchspace.dataverse.entities.facade;
+
+import java.net.URI;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.NonNull;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class License {
+    private @NonNull String name;
+    private @NonNull URI uri;
+}

From 19f41620fda203b3c75198a73473e9d7d9339b20 Mon Sep 17 00:00:00 2001
From: Akos Kukucska 
Date: Thu, 13 Nov 2025 15:24:14 +0100
Subject: [PATCH 6/6] Add NoArgsConstructor to DataverseConfig

---
 .../com/researchspace/dataverse/api/v1/DataverseConfig.java     | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/main/java/com/researchspace/dataverse/api/v1/DataverseConfig.java b/src/main/java/com/researchspace/dataverse/api/v1/DataverseConfig.java
index 357116e..4d7098b 100644
--- a/src/main/java/com/researchspace/dataverse/api/v1/DataverseConfig.java
+++ b/src/main/java/com/researchspace/dataverse/api/v1/DataverseConfig.java
@@ -8,6 +8,7 @@
 import lombok.AllArgsConstructor;
 import lombok.EqualsAndHashCode;
 import lombok.Getter;
+import lombok.NoArgsConstructor;
 import lombok.ToString;
 /**
  
@@ -32,6 +33,7 @@
 @EqualsAndHashCode(of={"serverURL"})
 @AllArgsConstructor
 @ToString()
+@NoArgsConstructor
 public class DataverseConfig {
 
 	private @Getter URL serverURL;