Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package edu.harvard.iq.dataverse.api.errorhandlers;

import edu.harvard.iq.dataverse.api.util.JsonResponseBuilder;
import edu.harvard.iq.dataverse.util.json.JsonParseException;
import jakarta.json.stream.JsonParsingException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.ws.rs.core.Context;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.ext.ExceptionMapper;
import jakarta.ws.rs.ext.Provider;

import java.util.logging.Level;
import java.util.logging.Logger;

/**
* Make a failing JSON parsing request appear to be a BadRequest (error code 400)
* and send a message what just failed...
*/
public abstract class JsonExceptionsHandler<T extends Exception> implements ExceptionMapper<T>{

static final Logger logger = Logger.getLogger(JsonExceptionsHandler.class.getSimpleName());

@Context
HttpServletRequest request;

@Override
public Response toResponse(T ex) {
return JsonResponseBuilder.error(Response.Status.BAD_REQUEST)
.log(logger, Level.FINER)
.message(ex.getMessage())
.build();
}

/**
* Handler for jakarta.json.stream.JsonParsingException
*/
@Provider
public static class JsonParsingExceptionMapper extends JsonExceptionsHandler<JsonParsingException> {
}

/**
* Handler for jakarta.json.stream.JsonParsingException
*/
@Provider
public static class DvUtilJsonParseExceptionMapper extends JsonExceptionsHandler<JsonParseException> {
}

// Add more handlers as needed (e.g., for Jackson, GSON, etc.)
// @Provider
// public static class JsonProcessingExceptionMapper extends JsonExceptionHandler<JsonProcessingException> {
// }
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package edu.harvard.iq.dataverse.api.util;

import jakarta.json.Json;
import jakarta.json.JsonObject;
import jakarta.json.JsonValue;
import jakarta.json.JsonObjectBuilder;
import jakarta.servlet.ServletResponse;
Expand Down Expand Up @@ -143,8 +144,9 @@ public JsonResponseBuilder internalError(Throwable ex) {
* @return JAX-RS response including JSON message
*/
public Response build() {
JsonObject entity = entityBuilder.build();
return jerseyResponseBuilder.type(MediaType.APPLICATION_JSON_TYPE)
.entity(this.entityBuilder.build())
.entity(entity)
.build();
}

Expand Down Expand Up @@ -215,9 +217,14 @@ public JsonResponseBuilder log(Logger logger, Level level, Optional<Throwable> e
if ( ! logger.isLoggable(level) || alreadyLogged )
return this;

StringBuilder metadata = new StringBuilder("");
this.entityBuilder.build()
.forEach((k,v) -> metadata.append("_"+k+"="+v.toString()+";"));
// This is necessary because we need to build in two places: logging and response creation.
// Without cloning the object builder, we'd end up with an empty entity in the response when logging before that.
JsonObject entity = this.entityBuilder.build();
this.entityBuilder = Json.createObjectBuilder(entity);

StringBuilder metadata = new StringBuilder();
entity.forEach((k,v) -> metadata.append("_").append(k).append("=").append(v.toString()).append(";"));

// remove trailing ;
metadata.deleteCharAt(metadata.length()-1);

Expand Down
16 changes: 14 additions & 2 deletions src/test/java/edu/harvard/iq/dataverse/api/AdminIT.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
Expand All @@ -29,7 +28,6 @@
import java.util.Map;
import java.util.UUID;
import java.util.logging.Logger;

import static io.restassured.RestAssured.given;
import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST;
import static jakarta.ws.rs.core.Response.Status.CREATED;
Expand All @@ -43,6 +41,7 @@
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import io.restassured.http.ContentType;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class AdminIT {
Expand Down Expand Up @@ -681,6 +680,19 @@ public void testCreateNonBuiltinUserViaApi() {
assertEquals(200, deleteUserToConvert.getStatusCode());
}


@Test
void testCreateUserViaAPI_WithInvalidJson() {
Response response = given()
.body("{invalid}")
.contentType(ContentType.JSON)
.post("/api/admin/authenticatedUsers");

response.then()
.assertThat()
.statusCode(BAD_REQUEST.getStatusCode())
.body("message", containsString("Unexpected char"));
}


@Test
Expand Down