Skip to content

Commit

Permalink
OperationResultStatus and OperationResultMessage headers (experimental).
Browse files Browse the repository at this point in the history
  • Loading branch information
mederly committed Jan 12, 2017
1 parent b20dbb9 commit c6951cd
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 23 deletions.
Expand Up @@ -243,8 +243,8 @@ public <T extends ObjectType> Response addObject(@PathParam("type") String type,
Class clazz = ObjectTypes.getClassFromRestType(type);
if (!object.getCompileTimeClass().equals(clazz)){
finishRequest(task);
return RestServiceUtil.buildErrorResponse(Status.BAD_REQUEST, "Request to add object of type "
+ object.getCompileTimeClass().getSimpleName() + " to the collection of " + type);
return RestServiceUtil.createErrorResponseBuilder(Status.BAD_REQUEST, "Request to add object of type "
+ object.getCompileTimeClass().getSimpleName() + " to the collection of " + type).build();
}


Expand Down Expand Up @@ -304,9 +304,9 @@ public <T extends ObjectType> Response addObject(@PathParam("type") String type,
Class clazz = ObjectTypes.getClassFromRestType(type);
if (!object.getCompileTimeClass().equals(clazz)){
finishRequest(task);
return RestServiceUtil.buildErrorResponse(Status.BAD_REQUEST, "Request to add object of type "
return RestServiceUtil.createErrorResponseBuilder(Status.BAD_REQUEST, "Request to add object of type "
+ object.getCompileTimeClass().getSimpleName()
+ " to the collection of " + type);
+ " to the collection of " + type).build();
}

ModelExecuteOptions modelExecuteOptions = ModelExecuteOptions.fromRestOptions(options);
Expand All @@ -317,25 +317,24 @@ public <T extends ObjectType> Response addObject(@PathParam("type") String type,
}

String oid;
Response response;
ResponseBuilder builder;
try {
oid = model.addObject(object, modelExecuteOptions, task, parentResult);
LOGGER.debug("returned oid : {}", oid );
LOGGER.debug("returned oid : {}", oid);

URI resourceURI = uriInfo.getAbsolutePathBuilder().path(oid).build(oid);
ResponseBuilder builder = clazz.isAssignableFrom(TaskType.class) ?
builder = clazz.isAssignableFrom(TaskType.class) ?
Response.accepted().location(resourceURI) : Response.created(resourceURI);

// (not used currently)
//validateIfRequested(object, options, builder, task, parentResult);
response = builder.build();
} catch (ObjectAlreadyExistsException e) {
response = Response.serverError().entity(e.getMessage()).build();
builder = Response.serverError().entity(e.getMessage());
} catch (Exception ex) {
response = RestServiceUtil.handleException(ex);
builder = RestServiceUtil.createErrorResponseBuilder(ex);
}

parentResult.computeStatus();
Response response = RestServiceUtil.createResultHeaders(builder, parentResult).build();

finishRequest(task);
return response;
}
Expand Down Expand Up @@ -459,7 +458,7 @@ public Response findShadowOwner(@PathParam("oid") String shadowOid, @Context Mes
PrismObject<UserType> user = model.findShadowOwner(shadowOid, task, parentResult);
response = Response.ok().entity(user).build();
} catch (ConfigurationException e) {
response = RestServiceUtil.buildErrorResponse(Status.INTERNAL_SERVER_ERROR, e.getMessage());
response = RestServiceUtil.createErrorResponseBuilder(Status.INTERNAL_SERVER_ERROR, e.getMessage()).build();
} catch (Exception ex) {
response = RestServiceUtil.handleException(ex);
}
Expand Down
Expand Up @@ -19,6 +19,7 @@
import com.evolveum.midpoint.model.api.ModelExecuteOptions;
import com.evolveum.midpoint.model.impl.security.SecurityHelper;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.security.api.ConnectionEnvironment;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.exception.*;
Expand All @@ -36,40 +37,46 @@ public class RestServiceUtil {

public static final String MESSAGE_PROPERTY_TASK_NAME = "task";
private static final String QUERY_PARAMETER_OPTIONS = "options";
public static final String OPERATION_RESULT_STATUS = "OperationResultStatus";
public static final String OPERATION_RESULT_MESSAGE = "OperationResultMessage";

public static Response handleException(Exception ex) {
return createErrorResponseBuilder(ex).build();
}

public static Response.ResponseBuilder createErrorResponseBuilder(Exception ex) {
if (ex instanceof ObjectNotFoundException) {
return buildErrorResponse(Response.Status.NOT_FOUND, ex);
return createErrorResponseBuilder(Response.Status.NOT_FOUND, ex);
}

if (ex instanceof CommunicationException) {
return buildErrorResponse(Response.Status.GATEWAY_TIMEOUT, ex);
return createErrorResponseBuilder(Response.Status.GATEWAY_TIMEOUT, ex);
}

if (ex instanceof SecurityViolationException) {
return buildErrorResponse(Response.Status.FORBIDDEN, ex);
return createErrorResponseBuilder(Response.Status.FORBIDDEN, ex);
}

if (ex instanceof ConfigurationException) {
return buildErrorResponse(Response.Status.BAD_GATEWAY, ex);
return createErrorResponseBuilder(Response.Status.BAD_GATEWAY, ex);
}

if (ex instanceof SchemaException
|| ex instanceof PolicyViolationException
|| ex instanceof ConsistencyViolationException
|| ex instanceof ObjectAlreadyExistsException) {
return buildErrorResponse(Response.Status.CONFLICT, ex);
return createErrorResponseBuilder(Response.Status.CONFLICT, ex);
}

return buildErrorResponse(Response.Status.INTERNAL_SERVER_ERROR, ex);
return createErrorResponseBuilder(Response.Status.INTERNAL_SERVER_ERROR, ex);
}

public static Response buildErrorResponse(Response.Status status, Exception ex) {
return buildErrorResponse(status, ex.getMessage());
private static Response.ResponseBuilder createErrorResponseBuilder(Response.Status status, Exception ex) {
return createErrorResponseBuilder(status, ex.getMessage());
}

public static Response buildErrorResponse(Response.Status status, String message) {
return Response.status(status).entity(message).type(MediaType.TEXT_PLAIN).build();
public static Response.ResponseBuilder createErrorResponseBuilder(Response.Status status, String message) {
return Response.status(status).entity(message).type(MediaType.TEXT_PLAIN);
}

public static ModelExecuteOptions getOptions(UriInfo uriInfo){
Expand All @@ -89,4 +96,11 @@ public static void finishRequest(Task task, SecurityHelper securityHelper) {
connEnv.setSessionId(task.getTaskIdentifier());
securityHelper.auditLogout(connEnv, task);
}

// slightly experimental
public static Response.ResponseBuilder createResultHeaders(Response.ResponseBuilder builder, OperationResult result) {
return builder
.header(OPERATION_RESULT_STATUS, result.getStatus())
.header(OPERATION_RESULT_MESSAGE, result.getMessage());
}
}

0 comments on commit c6951cd

Please sign in to comment.