From 4d5813f7f9dc0bd07a2d60725c8535de99661add Mon Sep 17 00:00:00 2001 From: Akos Kukucska Date: Thu, 4 Sep 2025 14:52:09 +0200 Subject: [PATCH 1/3] 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 0180ca878303227c1c9b5fabf5ab21a695a7b495 Mon Sep 17 00:00:00 2001 From: Akos Kukucska Date: Wed, 1 Oct 2025 14:08:11 +0200 Subject: [PATCH 2/3] 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 3/3] 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>>>() {
 		};