From 15149492f3f7a669050b63eb6383ca5c06083be1 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Tue, 2 Sep 2025 17:02:42 -0400 Subject: [PATCH] delete /api/admin/test but add some TODOs #11760 Enough functionality has been added in #11760 that it should be save to delete all of /api/admin/test (TestApi.java) because it was only testing external tools. However, if we incorporate this change into that PR we should do the following: - fix the backend to not return a toolUrl when it shouldn't (see testFileLevelToolWithAuxFileReq) - consider how we aren't exercising findDatasetToolsByType and findFileToolsByType anymore. They are used by JSF. - consider how we don't return the following fields when getting the toolUrl: scope, types, contentType - remove commented code that's just there for review --- .../edu/harvard/iq/dataverse/api/TestApi.java | 144 ------------------ .../iq/dataverse/api/ExternalToolsIT.java | 84 +++++----- .../edu/harvard/iq/dataverse/api/UtilIT.java | 142 +++++++++-------- 3 files changed, 128 insertions(+), 242 deletions(-) delete mode 100644 src/main/java/edu/harvard/iq/dataverse/api/TestApi.java diff --git a/src/main/java/edu/harvard/iq/dataverse/api/TestApi.java b/src/main/java/edu/harvard/iq/dataverse/api/TestApi.java deleted file mode 100644 index 48487488b11..00000000000 --- a/src/main/java/edu/harvard/iq/dataverse/api/TestApi.java +++ /dev/null @@ -1,144 +0,0 @@ -package edu.harvard.iq.dataverse.api; - -import edu.harvard.iq.dataverse.DataFile; -import edu.harvard.iq.dataverse.Dataset; -import edu.harvard.iq.dataverse.api.auth.AuthRequired; -import edu.harvard.iq.dataverse.authorization.users.ApiToken; -import edu.harvard.iq.dataverse.authorization.users.User; -import edu.harvard.iq.dataverse.engine.command.DataverseRequest; -import edu.harvard.iq.dataverse.externaltools.ExternalTool; -import edu.harvard.iq.dataverse.externaltools.ExternalToolHandler; -import java.util.List; -import jakarta.json.Json; -import jakarta.json.JsonArrayBuilder; -import jakarta.json.JsonObjectBuilder; -import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.PathParam; -import jakarta.ws.rs.QueryParam; -import jakarta.ws.rs.container.ContainerRequestContext; -import jakarta.ws.rs.core.Context; -import jakarta.ws.rs.core.Response; -import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; - -@Path("admin/test") -public class TestApi extends AbstractApiBean { - - @GET - @AuthRequired - @Path("datasets/{id}/externalTools") - public Response getDatasetExternalToolsforFile(@Context ContainerRequestContext crc, @PathParam("id") String idSupplied, @QueryParam("type") String typeSupplied) { - ExternalTool.Type type; - try { - type = ExternalTool.Type.fromString(typeSupplied); - } catch (IllegalArgumentException ex) { - return error(BAD_REQUEST, ex.getLocalizedMessage()); - } - - ApiToken apiToken = null; - User u = getRequestUser(crc); - apiToken = authSvc.getValidApiTokenForUser(u); - - Dataset dataset; - try { - dataset = findDatasetOrDie(idSupplied); - JsonArrayBuilder tools = Json.createArrayBuilder(); - List datasetTools = externalToolService.findDatasetToolsByType(type); - for (ExternalTool tool : datasetTools) { - ExternalToolHandler externalToolHandler = new ExternalToolHandler(tool, dataset, apiToken, null); - JsonObjectBuilder toolToJson = externalToolService.getToolAsJsonWithQueryParameters(externalToolHandler); - tools.add(toolToJson); - } - return ok(tools); - } catch (WrappedResponse wr) { - return wr.getResponse(); - } - } - - @GET - @AuthRequired - @Path("datasets/{id}/externalTool/{toolId}") - public Response getExternalToolforDatasetById(@Context ContainerRequestContext crc, @PathParam("id") String idSupplied, @PathParam("toolId") String toolId, @QueryParam("type") String typeSupplied) { - ExternalTool.Type type; - try { - type = ExternalTool.Type.fromString(typeSupplied); - } catch (IllegalArgumentException ex) { - return error(BAD_REQUEST, ex.getLocalizedMessage()); - } - - ApiToken apiToken = null; - User u = getRequestUser(crc); - apiToken = authSvc.getValidApiTokenForUser(u); - - Dataset dataset; - try { - dataset = findDatasetOrDie(idSupplied); - JsonArrayBuilder tools = Json.createArrayBuilder(); - List datasetTools = externalToolService.findDatasetToolsByType(type); - for (ExternalTool tool : datasetTools) { - ExternalToolHandler externalToolHandler = new ExternalToolHandler(tool, dataset, apiToken, null); - JsonObjectBuilder toolToJson = externalToolService.getToolAsJsonWithQueryParameters(externalToolHandler); - if (tool.getId().toString().equals(toolId)) { - return ok(toolToJson); - } - } - } catch (WrappedResponse wr) { - return wr.getResponse(); - } - return error(BAD_REQUEST, "Could not find external tool with id of " + toolId); - } - - @Path("files/{id}/externalTools") - @GET - public Response getExternalToolsForFile(@PathParam("id") String idSupplied, @QueryParam("type") String typeSupplied) { - ExternalTool.Type type; - try { - type = ExternalTool.Type.fromString(typeSupplied); - } catch (IllegalArgumentException ex) { - return error(BAD_REQUEST, ex.getLocalizedMessage()); - } - try { - DataFile dataFile = findDataFileOrDie(idSupplied); - JsonArrayBuilder tools = Json.createArrayBuilder(); - List datasetTools = externalToolService.findFileToolsByTypeAndContentType(type, dataFile.getContentType()); - for (ExternalTool tool : datasetTools) { - ApiToken apiToken = externalToolService.getApiToken(getRequestApiKey()); - ExternalToolHandler externalToolHandler = new ExternalToolHandler(tool, dataFile, apiToken, dataFile.getFileMetadata(), null); - JsonObjectBuilder toolToJson = externalToolService.getToolAsJsonWithQueryParameters(externalToolHandler); - if (externalToolService.meetsRequirements(tool, dataFile)) { - tools.add(toolToJson); - } - } - return ok(tools); - } catch (WrappedResponse wr) { - return wr.getResponse(); - } - } - - @Path("files/{id}/externalTool/{toolId}") - @GET - public Response getExternalToolForFileById(@PathParam("id") String idSupplied, @QueryParam("type") String typeSupplied, @PathParam("toolId") String toolId) { - ExternalTool.Type type; - try { - type = ExternalTool.Type.fromString(typeSupplied); - } catch (IllegalArgumentException ex) { - return error(BAD_REQUEST, ex.getLocalizedMessage()); - } - try { - DataFile dataFile = findDataFileOrDie(idSupplied); - List datasetTools = externalToolService.findFileToolsByTypeAndContentType(type, dataFile.getContentType()); - for (ExternalTool tool : datasetTools) { - ApiToken apiToken = externalToolService.getApiToken(getRequestApiKey()); - ExternalToolHandler externalToolHandler = new ExternalToolHandler(tool, dataFile, apiToken, dataFile.getFileMetadata(), null); - JsonObjectBuilder toolToJson = externalToolService.getToolAsJsonWithQueryParameters(externalToolHandler); - if (externalToolService.meetsRequirements(tool, dataFile) && tool.getId().toString().equals(toolId)) { - return ok(toolToJson); - } - } - return error(BAD_REQUEST, "Could not find external tool with id of " + toolId); - } catch (WrappedResponse wr) { - return wr.getResponse(); - } - } - -} diff --git a/src/test/java/edu/harvard/iq/dataverse/api/ExternalToolsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/ExternalToolsIT.java index 6b550886845..4945a11427d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/ExternalToolsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/ExternalToolsIT.java @@ -96,14 +96,15 @@ public void testExternalToolsNonAdminEndpoint() { .body("data.displayName", CoreMatchers.equalTo("Dataset Configurator")); Long toolId = JsonPath.from(addExternalTool.getBody().asString()).getLong("data.id"); - Response getExternalToolsByDatasetId = UtilIT.getExternalToolForDatasetById(datasetId.toString(), "configure", apiToken, toolId.toString()); +// Response getExternalToolsByDatasetId = UtilIT.getExternalToolForDatasetById(datasetId.toString(), "configure", apiToken, toolId.toString()); // TODO: delete + Response getExternalToolsByDatasetId = UtilIT.getDatasetToolUrl(datasetId.toString(), toolId.toString(), apiToken, null); getExternalToolsByDatasetId.prettyPrint(); getExternalToolsByDatasetId.then().assertThat() + .statusCode(OK.getStatusCode()) .body("data.displayName", CoreMatchers.equalTo("Dataset Configurator")) - .body("data.scope", CoreMatchers.equalTo("dataset")) - .body("data.types[0]", CoreMatchers.equalTo("configure")) - .body("data.toolUrlWithQueryParams", CoreMatchers.equalTo("https://datasetconfigurator.com?datasetPid=" + datasetPid)) - .statusCode(OK.getStatusCode()); +// .body("data.scope", CoreMatchers.equalTo("dataset")) +// .body("data.types[0]", CoreMatchers.equalTo("configure")) + .body("data.toolUrl", CoreMatchers.equalTo("https://datasetconfigurator.com?datasetPid=" + datasetPid)); Response getExternalTools = UtilIT.getExternalTools(apiToken); getExternalTools.prettyPrint(); @@ -119,7 +120,9 @@ public void testExternalToolsNonAdminEndpoint() { getExternalTools = UtilIT.getExternalTools(apiToken); getExternalTools.then().assertThat() .statusCode(OK.getStatusCode()); - getExternalToolsByDatasetId = UtilIT.getExternalToolForDatasetById(datasetId.toString(), "configure", apiToken, toolId.toString()); + +// getExternalToolsByDatasetId = UtilIT.getExternalToolForDatasetById(datasetId.toString(), "configure", apiToken, toolId.toString()); // TODO: delete + getExternalToolsByDatasetId = UtilIT.getDatasetToolUrl(datasetId.toString(), toolId.toString(), apiToken, null); getExternalToolsByDatasetId.prettyPrint(); getExternalToolsByDatasetId.then().assertThat() .statusCode(OK.getStatusCode()); @@ -216,30 +219,31 @@ public void testFileLevelTool1() { .body("data.scope", CoreMatchers.equalTo("file")) .statusCode(OK.getStatusCode()); - Response getExternalToolsForFileInvalidType = UtilIT.getExternalToolsForFile(tabularFileId.toString(), "invalidType", apiToken); - getExternalToolsForFileInvalidType.prettyPrint(); - getExternalToolsForFileInvalidType.then().assertThat() - .statusCode(BAD_REQUEST.getStatusCode()) - .body("message", CoreMatchers.equalTo("Type must be one of these values: [explore, configure, preview, query].")); + // TODO: delete this test +// Response getExternalToolsForFileInvalidType = UtilIT.getExternalToolsForFile(tabularFileId.toString(), "invalidType", apiToken); +// getExternalToolsForFileInvalidType.prettyPrint(); +// getExternalToolsForFileInvalidType.then().assertThat() +// .statusCode(BAD_REQUEST.getStatusCode()) +// .body("message", CoreMatchers.equalTo("Type must be one of these values: [explore, configure, preview, query].")); // Getting tool by tool Id to avoid issue where there are existing tools String toolIdString = toolId.toString(); - Response getExternalToolsForTabularFiles = UtilIT.getExternalToolForFileById(tabularFileId.toString(), "explore", apiToken, toolIdString); +// Response getExternalToolsForTabularFiles = UtilIT.getExternalToolForFileById(tabularFileId.toString(), "explore", apiToken, toolIdString); // TODO: delete + Response getExternalToolsForTabularFiles = UtilIT.getFileToolUrl(tabularFileId.toString(), toolIdString, apiToken, null); getExternalToolsForTabularFiles.prettyPrint(); - getExternalToolsForTabularFiles.then().assertThat() .statusCode(OK.getStatusCode()) .body("data.displayName", CoreMatchers.equalTo("AwesomeTool")) - .body("data.scope", CoreMatchers.equalTo("file")) - .body("data.contentType", CoreMatchers.equalTo("text/tab-separated-values")) - .body("data.toolUrlWithQueryParams", CoreMatchers.equalTo("http://awesometool.com?fileid=" + tabularFileId + "&key=" + apiToken)); +// .body("data.scope", CoreMatchers.equalTo("file")) +// .body("data.contentType", CoreMatchers.equalTo("text/tab-separated-values")) + .body("data.toolUrl", CoreMatchers.equalTo("http://awesometool.com?fileid=" + tabularFileId + "&key=" + apiToken)); - Response getExternalToolsForJuptyerNotebooks = UtilIT.getExternalToolsForFile(jupyterNotebookFileId.toString(), "explore", apiToken); + Response getExternalToolsForJuptyerNotebooks = UtilIT.getFileToolUrl(jupyterNotebookFileId.toString(), toolId.toString(), apiToken, null); getExternalToolsForJuptyerNotebooks.prettyPrint(); getExternalToolsForJuptyerNotebooks.then().assertThat() - .statusCode(OK.getStatusCode()) + .statusCode(BAD_REQUEST.getStatusCode()) // No tools for this file type. - .body("data", Matchers.hasSize(0)); + .body("message", CoreMatchers.equalTo("External tool content type (text/tab-separated-values) does not match file content type (application/x-ipynb+json).")); //Delete the tool added by this test... Response deleteExternalTool = UtilIT.deleteExternalTool(toolId); @@ -306,18 +310,20 @@ public void testDatasetLevelTool1() { Long toolId = JsonPath.from(addExternalTool.getBody().asString()).getLong("data.id"); - Response getExternalToolsByDatasetIdInvalidType = UtilIT.getExternalToolsForDataset(datasetId.toString(), "invalidType", apiToken); - getExternalToolsByDatasetIdInvalidType.prettyPrint(); - getExternalToolsByDatasetIdInvalidType.then().assertThat() - .statusCode(BAD_REQUEST.getStatusCode()) - .body("message", CoreMatchers.equalTo("Type must be one of these values: [explore, configure, preview, query].")); - - Response getExternalToolsByDatasetId = UtilIT.getExternalToolForDatasetById(datasetId.toString(), "explore", apiToken, toolId.toString()); + // TODO: delete this test +// Response getExternalToolsByDatasetIdInvalidType = UtilIT.getExternalToolsForDataset(datasetId.toString(), "invalidType", apiToken); +// getExternalToolsByDatasetIdInvalidType.prettyPrint(); +// getExternalToolsByDatasetIdInvalidType.then().assertThat() +// .statusCode(BAD_REQUEST.getStatusCode()) +// .body("message", CoreMatchers.equalTo("Type must be one of these values: [explore, configure, preview, query].")); +// +// Response getExternalToolsByDatasetId = UtilIT.getExternalToolForDatasetById(datasetId.toString(), "explore", apiToken, toolId.toString()); + Response getExternalToolsByDatasetId = UtilIT.getDatasetToolUrl(datasetId.toString(), toolId.toString(), apiToken, null); getExternalToolsByDatasetId.prettyPrint(); getExternalToolsByDatasetId.then().assertThat() .body("data.displayName", CoreMatchers.equalTo("DatasetTool1")) - .body("data.scope", CoreMatchers.equalTo("dataset")) - .body("data.toolUrlWithQueryParams", CoreMatchers.equalTo("http://datasettool1.com?datasetPid=" + datasetPid + "&key=" + apiToken)) +// .body("data.scope", CoreMatchers.equalTo("dataset")) + .body("data.toolUrl", CoreMatchers.equalTo("http://datasettool1.com?datasetPid=" + datasetPid + "&key=" + apiToken)) .statusCode(OK.getStatusCode()); //Delete the tool added by this test... @@ -379,13 +385,14 @@ public void testDatasetLevelToolConfigure() { .body("data.displayName", CoreMatchers.equalTo("Dataset Configurator")); Long toolId = JsonPath.from(addExternalTool.getBody().asString()).getLong("data.id"); - Response getExternalToolsByDatasetId = UtilIT.getExternalToolForDatasetById(datasetId.toString(), "configure", apiToken, toolId.toString()); +// Response getExternalToolsByDatasetId = UtilIT.getExternalToolForDatasetById(datasetId.toString(), "configure", apiToken, toolId.toString()); // TODO: delete + Response getExternalToolsByDatasetId = UtilIT.getDatasetToolUrl(datasetId.toString(), toolId.toString(), apiToken, null); getExternalToolsByDatasetId.prettyPrint(); getExternalToolsByDatasetId.then().assertThat() .body("data.displayName", CoreMatchers.equalTo("Dataset Configurator")) - .body("data.scope", CoreMatchers.equalTo("dataset")) - .body("data.types[0]", CoreMatchers.equalTo("configure")) - .body("data.toolUrlWithQueryParams", CoreMatchers.equalTo("https://datasetconfigurator.com?datasetPid=" + datasetPid)) +// .body("data.scope", CoreMatchers.equalTo("dataset")) +// .body("data.types[0]", CoreMatchers.equalTo("configure")) + .body("data.toolUrl", CoreMatchers.equalTo("https://datasetconfigurator.com?datasetPid=" + datasetPid)) .statusCode(OK.getStatusCode()); //Delete the tool added by this test... @@ -709,20 +716,23 @@ public void testFileLevelToolWithAuxFileReq() throws IOException { .statusCode(OK.getStatusCode()); // No tools for false HDF5 file. Aux file couldn't be extracted. Doesn't meet requirements. - Response getToolsForFalseHdf5 = UtilIT.getExternalToolsForFile(falseHdf5.toString(), "preview", apiToken); +// Response getToolsForFalseHdf5 = UtilIT.getExternalToolsForFile(falseHdf5.toString(), "preview", apiToken); // TODO: delete + Response getToolsForFalseHdf5 = UtilIT.getFileToolUrl(falseHdf5.toString(), toolId.toString(), apiToken, null); getToolsForFalseHdf5.prettyPrint(); + // TODO: update this assertion once the backend is fixed. The backend should not be offering a tool in this case. getToolsForFalseHdf5.then().assertThat() .statusCode(OK.getStatusCode()) .body("data", Matchers.hasSize(0)); // The tool shows for a true HDF5 file. The NcML aux file is available. Requirements met. - Response getToolsForTrueHdf5 = UtilIT.getExternalToolForFileById(trueHdf5.toString(), "preview", apiToken, toolId.toString()); +// Response getToolsForTrueHdf5 = UtilIT.getExternalToolForFileById(trueHdf5.toString(), "preview", apiToken, toolId.toString()); // TODO: delete + Response getToolsForTrueHdf5 = UtilIT.getFileToolUrl(trueHdf5.toString(), toolId.toString(), apiToken, null); getToolsForTrueHdf5.prettyPrint(); getToolsForTrueHdf5.then().assertThat() .statusCode(OK.getStatusCode()) - .body("data.displayName", CoreMatchers.equalTo("HDF5 Tool")) - .body("data.scope", CoreMatchers.equalTo("file")) - .body("data.contentType", CoreMatchers.equalTo("application/x-hdf5")); + .body("data.displayName", CoreMatchers.equalTo("HDF5 Tool")); +// .body("data.scope", CoreMatchers.equalTo("file")) +// .body("data.contentType", CoreMatchers.equalTo("application/x-hdf5")); //Delete the tool added by this test... Response deleteExternalTool = UtilIT.deleteExternalTool(toolId); 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 fe4f71669b1..97078cfbf9d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -2795,65 +2795,81 @@ static Response deleteExternalTool(long externalToolid, String apiToken) { return requestSpecification.delete("/api/externalTools/" + externalToolid); } - static Response getExternalToolsForDataset(String idOrPersistentIdOfDataset, String type, String apiToken) { - String idInPath = idOrPersistentIdOfDataset; // Assume it's a number. - String optionalQueryParam = ""; // If idOrPersistentId is a number we'll just put it in the path. - if (!NumberUtils.isCreatable(idOrPersistentIdOfDataset)) { - idInPath = ":persistentId"; - optionalQueryParam = "&persistentId=" + idOrPersistentIdOfDataset; - } - RequestSpecification requestSpecification = given(); - if (apiToken != null) { - requestSpecification = given() - .header(UtilIT.API_TOKEN_HTTP_HEADER, apiToken); - } - return requestSpecification.get("/api/admin/test/datasets/" + idInPath + "/externalTools?type=" + type + optionalQueryParam); - } - - static Response getExternalToolForDatasetById(String idOrPersistentIdOfDataset, String type, String apiToken, String toolId) { - String idInPath = idOrPersistentIdOfDataset; // Assume it's a number. - String optionalQueryParam = ""; // If idOrPersistentId is a number we'll just put it in the path. - if (!NumberUtils.isCreatable(idOrPersistentIdOfDataset)) { - idInPath = ":persistentId"; - optionalQueryParam = "&persistentId=" + idOrPersistentIdOfDataset; - } - RequestSpecification requestSpecification = given(); - if (apiToken != null) { - requestSpecification = given() - .header(UtilIT.API_TOKEN_HTTP_HEADER, apiToken); - } - return requestSpecification.get("/api/admin/test/datasets/" + idInPath + "/externalTool/" + toolId + "?type=" + type + optionalQueryParam); - } - - static Response getExternalToolsForFile(String idOrPersistentIdOfFile, String type, String apiToken) { - String idInPath = idOrPersistentIdOfFile; // Assume it's a number. - String optionalQueryParam = ""; // If idOrPersistentId is a number we'll just put it in the path. - if (!NumberUtils.isCreatable(idOrPersistentIdOfFile)) { - idInPath = ":persistentId"; - optionalQueryParam = "&persistentId=" + idOrPersistentIdOfFile; - } - RequestSpecification requestSpecification = given(); - if (apiToken != null) { - requestSpecification = given() - .header(UtilIT.API_TOKEN_HTTP_HEADER, apiToken); - } - return requestSpecification.get("/api/admin/test/files/" + idInPath + "/externalTools?type=" + type + optionalQueryParam); - } - - static Response getExternalToolForFileById(String idOrPersistentIdOfFile, String type, String apiToken, String toolId) { - String idInPath = idOrPersistentIdOfFile; // Assume it's a number. - String optionalQueryParam = ""; // If idOrPersistentId is a number we'll just put it in the path. - if (!NumberUtils.isCreatable(idOrPersistentIdOfFile)) { - idInPath = ":persistentId"; - optionalQueryParam = "&persistentId=" + idOrPersistentIdOfFile; - } - RequestSpecification requestSpecification = given(); - if (apiToken != null) { - requestSpecification = given() - .header(UtilIT.API_TOKEN_HTTP_HEADER, apiToken); - } - return requestSpecification.get("/api/admin/test/files/" + idInPath + "/externalTool/" + toolId + "?type=" + type + optionalQueryParam); - } + /** + * TODO: delete all this commented-out code. It's here while we're reviewing + * https://github.com/IQSS/dataverse/pull/11760 but all these methods no + * longer exist once TestApi.java, which we are proposing we delete, is + * gone. Some comments on these methods: + * + * - getExternalToolsForDataset and getExternalToolForDatasetById: These + * methods were exercising externalToolService.findDatasetToolsByType. Now + * this code is only exercised by JSF. Does this matter? Will the SPA use + * this method? + * + * - getExternalToolForFile and getExternalToolForFileById: Same but these + * methods were exercising externalToolService.findFileToolsByType (byType + * for files instead of datasets). Now only JSF calls into this method. + */ +// +// static Response getExternalToolsForDataset(String idOrPersistentIdOfDataset, String type, String apiToken) { +// String idInPath = idOrPersistentIdOfDataset; // Assume it's a number. +// String optionalQueryParam = ""; // If idOrPersistentId is a number we'll just put it in the path. +// if (!NumberUtils.isCreatable(idOrPersistentIdOfDataset)) { +// idInPath = ":persistentId"; +// optionalQueryParam = "&persistentId=" + idOrPersistentIdOfDataset; +// } +// RequestSpecification requestSpecification = given(); +// if (apiToken != null) { +// requestSpecification = given() +// .header(UtilIT.API_TOKEN_HTTP_HEADER, apiToken); +// } +// return requestSpecification.get("/api/admin/test/datasets/" + idInPath + "/externalTools?type=" + type + optionalQueryParam); +// } +// +// static Response getExternalToolForDatasetById(String idOrPersistentIdOfDataset, String type, String apiToken, String toolId) { +// String idInPath = idOrPersistentIdOfDataset; // Assume it's a number. +// String optionalQueryParam = ""; // If idOrPersistentId is a number we'll just put it in the path. +// if (!NumberUtils.isCreatable(idOrPersistentIdOfDataset)) { +// idInPath = ":persistentId"; +// optionalQueryParam = "&persistentId=" + idOrPersistentIdOfDataset; +// } +// RequestSpecification requestSpecification = given(); +// if (apiToken != null) { +// requestSpecification = given() +// .header(UtilIT.API_TOKEN_HTTP_HEADER, apiToken); +// } +// return requestSpecification.get("/api/admin/test/datasets/" + idInPath + "/externalTool/" + toolId + "?type=" + type + optionalQueryParam); +// } +// +// static Response getExternalToolsForFile(String idOrPersistentIdOfFile, String type, String apiToken) { +// String idInPath = idOrPersistentIdOfFile; // Assume it's a number. +// String optionalQueryParam = ""; // If idOrPersistentId is a number we'll just put it in the path. +// if (!NumberUtils.isCreatable(idOrPersistentIdOfFile)) { +// idInPath = ":persistentId"; +// optionalQueryParam = "&persistentId=" + idOrPersistentIdOfFile; +// } +// RequestSpecification requestSpecification = given(); +// if (apiToken != null) { +// requestSpecification = given() +// .header(UtilIT.API_TOKEN_HTTP_HEADER, apiToken); +// } +// return requestSpecification.get("/api/admin/test/files/" + idInPath + "/externalTools?type=" + type + optionalQueryParam); +// } +// +// static Response getExternalToolForFileById(String idOrPersistentIdOfFile, String type, String apiToken, String toolId) { +// String idInPath = idOrPersistentIdOfFile; // Assume it's a number. +// String optionalQueryParam = ""; // If idOrPersistentId is a number we'll just put it in the path. +// if (!NumberUtils.isCreatable(idOrPersistentIdOfFile)) { +// idInPath = ":persistentId"; +// optionalQueryParam = "&persistentId=" + idOrPersistentIdOfFile; +// } +// RequestSpecification requestSpecification = given(); +// if (apiToken != null) { +// requestSpecification = given() +// .header(UtilIT.API_TOKEN_HTTP_HEADER, apiToken); +// } +// return requestSpecification.get("/api/admin/test/files/" + idInPath + "/externalTool/" + toolId + "?type=" + type + optionalQueryParam); +// } static Response submitFeedback(JsonObjectBuilder job) { return given() @@ -4978,7 +4994,9 @@ public static Response getTemplates(String dataverseAlias, String apiToken) { * @param datasetId The ID of the dataset * @param toolId The ID of the external tool * @param apiToken The API token for authentication - * @param params Optional parameters (can be null) + * @param params Optional parameters (can be null). preview: boolean flag to + * indicate if the tool should run in preview mode (default: false), locale: + * string specifying the locale for internationalization * @return Response from the API */ public static Response getDatasetToolUrl(String datasetId, String toolId, String apiToken, JsonObject params) { @@ -4998,7 +5016,9 @@ public static Response getDatasetToolUrl(String datasetId, String toolId, String * @param fileId The ID of the file * @param toolId The ID of the external tool * @param apiToken The API token for authentication - * @param params Optional parameters (can be null) + * @param params Optional parameters (can be null). preview: boolean flag to + * indicate if the tool should run in preview mode (default: false), locale: + * string specifying the locale for internationalization * @return Response from the API */ public static Response getFileToolUrl(String fileId, String toolId, String apiToken, JsonObject params) {