Skip to content

Commit 7fdcd35

Browse files
authored
Merge pull request #11857 from akos326/metadataLanguage-API-call
Metadata language api call
2 parents 0b69f23 + 7049435 commit 7fdcd35

File tree

8 files changed

+226
-0
lines changed

8 files changed

+226
-0
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
A new API endpoint has been implemented for getting the metadata language of a Dataverse Collection:
2+
3+
`GET /dataverses/{alias}/allowedMetadataLanguages`: Returns the specified metadata language(s) in the collection if any.
4+
`PUT /dataverses/{alias}/allowedMetadataLanguages{metadataLanguage}`: Sets a metadata language in the collection.
5+
6+
For more information, see #11856 and #11856.

doc/sphinx-guides/source/api/native-api.rst

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,51 @@ The fully expanded example above (without environment variables) looks like this
287287
288288
curl -H "X-Dataverse-key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" "https://demo.dataverse.org/api/dataverses/root/roles"
289289
290+
List the Allowed Metadata Languages of a Dataverse Collection
291+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
292+
293+
Shows the allowed metadata languages of the Dataverse collection ``id``:
294+
295+
.. code-block:: bash
296+
297+
export API_TOKEN=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
298+
export SERVER_URL=https://demo.dataverse.org
299+
export ID=root
300+
301+
curl -H "X-Dataverse-key:$API_TOKEN" "$SERVER_URL/api/dataverses/$ID/allowedMetadataLanguages"
302+
303+
The fully expanded example above (without environment variables) looks like this:
304+
305+
.. code-block:: bash
306+
307+
curl -H "X-Dataverse-key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" "https://demo.dataverse.org/api/dataverses/root/allowedMetadataLanguages"
308+
309+
If there are no metadata languages configured on the server, this call returns an empty array. If the Dataverse collection has a mandatory metadata language, the return value is an array of that single language,
310+
otherwise it's an array of all available metadata languages on the server.
311+
312+
Set the Allowed Metadata Language of a Dataverse Collection
313+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
314+
315+
Sets the allowed metadata language of the Dataverse collection ``id`` to ``langCode`` if it's available on the server:
316+
317+
.. code-block:: bash
318+
319+
export API_TOKEN=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
320+
export SERVER_URL=https://demo.dataverse.org
321+
export ID=root
322+
export LANGCODE=en
323+
324+
curl -H "X-Dataverse-key:$API_TOKEN" -X PUT "$SERVER_URL/api/dataverses/$ID/allowedMetadataLanguages/$LANGCODE"
325+
326+
The fully expanded example above (without environment variables) looks like this:
327+
328+
.. code-block:: bash
329+
330+
curl -H "X-Dataverse-key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -X PUT "https://demo.dataverse.org/api/dataverses/root/allowedMetadataLanguages/en"
331+
332+
Returns an array of the set metadata language.
333+
If the metadata language is not available on the server, this call responds with a 400 BAD REQUEST.
334+
290335
List Facets Configured for a Dataverse Collection
291336
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
292337

src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2001,6 +2001,34 @@ public Response createTemplate(@Context ContainerRequestContext crc, String body
20012001
return e.getResponse();
20022002
}
20032003
}
2004+
2005+
@GET
2006+
@AuthRequired
2007+
@Path("{identifier}/allowedMetadataLanguages")
2008+
public Response getMetadataLanguage(@Context ContainerRequestContext crc, @PathParam("identifier") String dvIdtf) {
2009+
return response(req -> {
2010+
Dataverse dataverse = findDataverseOrDie(dvIdtf);
2011+
return ok(jsonLanguage(execCommand(
2012+
new GetDataverseMetadataLanguageCommand(req, dataverse))));
2013+
}, getRequestUser(crc));
2014+
}
2015+
2016+
@PUT
2017+
@AuthRequired
2018+
@Path("{identifier}/allowedMetadataLanguages/{metadataLanguage}")
2019+
public Response setMetadataLanguage(@Context ContainerRequestContext crc, @PathParam("identifier") String dvIdtf, @PathParam("metadataLanguage") String lang) {
2020+
return response(req -> {
2021+
Map<String, String> langMap = settingsService.getBaseMetadataLanguageMap(null, true);
2022+
if (langMap.isEmpty()) {
2023+
return badRequest("There are no metadata languages configured on this server");
2024+
}
2025+
if (!langMap.containsKey(lang)) {
2026+
return badRequest("The specified metadata language " + lang + " is not allowed on this server!");
2027+
}
2028+
Dataverse dataverse = findDataverseOrDie(dvIdtf);
2029+
return ok(jsonLanguage(execCommand(new SetDataverseMetadataLanguageCommand(req, dataverse, lang))));
2030+
}, getRequestUser(crc));
2031+
}
20042032

20052033
@GET
20062034
@AuthRequired
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package edu.harvard.iq.dataverse.engine.command.impl;
2+
3+
import java.util.Collections;
4+
import java.util.Map;
5+
import java.util.Set;
6+
7+
import edu.harvard.iq.dataverse.Dataverse;
8+
import edu.harvard.iq.dataverse.DvObjectContainer;
9+
import edu.harvard.iq.dataverse.authorization.Permission;
10+
import edu.harvard.iq.dataverse.engine.command.AbstractCommand;
11+
import edu.harvard.iq.dataverse.engine.command.CommandContext;
12+
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
13+
import edu.harvard.iq.dataverse.engine.command.exception.CommandException;
14+
15+
public class GetDataverseMetadataLanguageCommand extends AbstractCommand<Map<String, String>> {
16+
17+
private final Dataverse dv;
18+
19+
public GetDataverseMetadataLanguageCommand(DataverseRequest aRequest, Dataverse dv) {
20+
super(aRequest, dv);
21+
this.dv = dv;
22+
}
23+
24+
@Override
25+
public Map<String, String> execute(CommandContext ctxt) throws CommandException {
26+
Map<String, String> langMap = ctxt.settings().getBaseMetadataLanguageMap(null, true);
27+
String dvMetadataLanguage = dv.getMetadataLanguage();
28+
if (!dvMetadataLanguage.equals(DvObjectContainer.UNDEFINED_CODE)) {
29+
return Collections.singletonMap(dvMetadataLanguage, langMap.get(dvMetadataLanguage));
30+
}
31+
return langMap;
32+
33+
}
34+
35+
@Override
36+
public Map<String, Set<Permission>> getRequiredPermissions() {
37+
return Collections.singletonMap("",
38+
dv.isReleased() ? Collections.<Permission>emptySet()
39+
: Collections.singleton(Permission.ViewUnpublishedDataverse));
40+
}
41+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package edu.harvard.iq.dataverse.engine.command.impl;
2+
3+
import java.util.Collections;
4+
import java.util.Map;
5+
6+
import edu.harvard.iq.dataverse.Dataverse;
7+
import edu.harvard.iq.dataverse.DvObject;
8+
import edu.harvard.iq.dataverse.authorization.Permission;
9+
import edu.harvard.iq.dataverse.engine.command.AbstractCommand;
10+
import edu.harvard.iq.dataverse.engine.command.CommandContext;
11+
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
12+
import edu.harvard.iq.dataverse.engine.command.RequiredPermissions;
13+
import edu.harvard.iq.dataverse.engine.command.exception.CommandException;
14+
15+
@RequiredPermissions(Permission.EditDataverse)
16+
public class SetDataverseMetadataLanguageCommand extends AbstractCommand<Map<String,String>> {
17+
18+
private Dataverse dv;
19+
private String lang;
20+
21+
public SetDataverseMetadataLanguageCommand(DataverseRequest aRequest, Dataverse dv, String lang) {
22+
super(aRequest, dv);
23+
this.dv = dv;
24+
this.lang = lang;
25+
}
26+
27+
@Override
28+
public Map<String, String> execute(CommandContext ctxt) throws CommandException {
29+
dv.setMetadataLanguage(lang);
30+
return Collections.singletonMap(lang, ctxt.settings().getBaseMetadataLanguageMap(null, true).get(lang));
31+
}
32+
33+
}

src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1719,7 +1719,17 @@ public static JsonArrayBuilder json(List<UserNotification> notifications, Authen
17191719

17201720
return notificationsArray;
17211721
}
1722+
1723+
public static JsonObjectBuilder jsonLanguage(String locale, String title) {
1724+
// returns a single metadata language entry
1725+
return jsonObjectBuilder().add("locale", locale).add("title", title);
1726+
}
17221727

1728+
public static JsonArrayBuilder jsonLanguage(Map<String, String> langMap) {
1729+
// returns an array of metadatalanguages
1730+
return Json.createArrayBuilder(langMap.entrySet().stream().map(entry -> jsonLanguage(entry.getKey(), entry.getValue())).toList());
1731+
}
1732+
17231733
public static JsonArrayBuilder jsonDatasetVersionSummaries(List<DatasetVersionSummary> summaries) {
17241734
JsonArrayBuilder arrayBuilder = Json.createArrayBuilder();
17251735
summaries.stream()

src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.text.MessageFormat;
2323
import java.util.Arrays;
2424
import java.util.List;
25+
import java.util.Map;
2526
import java.util.logging.Logger;
2627

2728
import jakarta.json.Json;
@@ -30,8 +31,12 @@
3031
import jakarta.ws.rs.core.Response.Status;
3132

3233
import org.junit.jupiter.api.AfterAll;
34+
import org.junit.jupiter.api.AfterEach;
3335
import org.junit.jupiter.api.BeforeAll;
3436
import org.junit.jupiter.api.Test;
37+
import org.junit.jupiter.api.parallel.Isolated;
38+
import org.junit.jupiter.api.parallel.ResourceAccessMode;
39+
import org.junit.jupiter.api.parallel.ResourceLock;
3540

3641
import static jakarta.ws.rs.core.Response.Status.*;
3742
import static org.hamcrest.CoreMatchers.*;
@@ -49,18 +54,27 @@
4954
import org.hamcrest.Matchers;
5055
import static org.hamcrest.Matchers.greaterThan;
5156

57+
@ResourceLock(value = "MetadataLanguages", mode = ResourceAccessMode.READ_WRITE)
58+
@Isolated
5259
public class DataversesIT {
5360

5461
private static final Logger logger = Logger.getLogger(DataversesIT.class.getCanonicalName());
5562

5663
@BeforeAll
5764
public static void setUpClass() {
5865
RestAssured.baseURI = UtilIT.getRestAssuredBaseUri();
66+
UtilIT.deleteSetting(SettingsServiceBean.Key.MetadataLanguages);
5967
}
6068

6169
@AfterAll
6270
public static void afterClass() {
6371
Response removeExcludeEmail = UtilIT.deleteSetting(SettingsServiceBean.Key.ExcludeEmailFromExport);
72+
UtilIT.deleteSetting(SettingsServiceBean.Key.MetadataLanguages);
73+
}
74+
75+
@AfterEach
76+
public void afterEach() {
77+
UtilIT.deleteSetting(SettingsServiceBean.Key.MetadataLanguages);
6478
}
6579

6680
@Test
@@ -2745,4 +2759,37 @@ private String getSuperuserToken() {
27452759
UtilIT.makeSuperUser(username);
27462760
return adminApiToken;
27472761
}
2762+
2763+
@Test
2764+
public void testDataverseMetadataLanguage() {
2765+
Response createUser = UtilIT.createRandomUser();
2766+
createUser.prettyPrint();
2767+
String apiToken = UtilIT.getApiTokenFromResponse(createUser);
2768+
Response createDataverse1Response = UtilIT.createRandomDataverse(apiToken);
2769+
2770+
createDataverse1Response.prettyPrint();
2771+
createDataverse1Response.then().assertThat().statusCode(CREATED.getStatusCode());
2772+
2773+
String alias = UtilIT.getAliasFromResponse(createDataverse1Response);
2774+
2775+
Response noLang = UtilIT.getDataverseMetadataLanguage(alias, apiToken);
2776+
noLang.prettyPrint();
2777+
2778+
noLang.then().assertThat().body("data", equalTo(List.of()));
2779+
2780+
UtilIT.setSetting(SettingsServiceBean.Key.MetadataLanguages,
2781+
"[{\"locale\":\"en\",\"title\":\"English\"},{\"locale\":\"hu\",\"title\":\"magyar\"}]");
2782+
Response allLangs = UtilIT.getDataverseMetadataLanguage(alias, apiToken);
2783+
allLangs.prettyPrint();
2784+
allLangs.then().assertThat()
2785+
.body("data.size()", equalTo(2))
2786+
.and().body("data[0].locale", equalTo("en"))
2787+
.and().body("data[1].locale", equalTo("hu"));
2788+
2789+
Response english = UtilIT.setDataverseMetadataLanguage(alias, apiToken, "en");
2790+
english.then().assertThat().body("data", equalTo(List.of(Map.of("locale", "en", "title", "English"))));
2791+
Response singleLang = UtilIT.getDataverseMetadataLanguage(alias, apiToken);
2792+
singleLang.then().assertThat().body("data", equalTo(List.of(Map.of("locale", "en", "title", "English"))));
2793+
}
2794+
27482795
}

src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5151,6 +5151,22 @@ public static Response callCallbackUrl(String callbackUrl) {
51515151
.get(callbackUrl);
51525152
}
51535153

5154+
public static Response getDataverseMetadataLanguage(String alias, String apiToken) {
5155+
return given()
5156+
.header(API_TOKEN_HTTP_HEADER, apiToken)
5157+
.get("/api/dataverses/"
5158+
+ alias
5159+
+ "/allowedMetadataLanguages");
5160+
}
5161+
5162+
public static Response setDataverseMetadataLanguage(String alias, String apiToken, String lang) {
5163+
return given()
5164+
.header(API_TOKEN_HTTP_HEADER, apiToken)
5165+
.put("/api/dataverses/"
5166+
+ alias
5167+
+ "/allowedMetadataLanguages/"
5168+
+ lang);
5169+
}
51545170

51555171
public static Response getDataverseRoleAssignmentHistory(String dataverseAlias, boolean downloadAsCsv, String apiToken) {
51565172
RequestSpecification requestSpecification = given()

0 commit comments

Comments
 (0)