Remove ResponseSessionTask
- this was tightly related to retriable transactions added to map store and is no longer needed. Closes #25309 Signed-off-by: Stefan Guilhen <sguilhen@redhat.com>
This commit is contained in:
parent
8e918c2ebf
commit
7b63d6d500
1 changed files with 0 additions and 90 deletions
|
@ -1,90 +0,0 @@
|
|||
/*
|
||||
* Copyright 2022 Red Hat, Inc. and/or its affiliates
|
||||
* and other contributors as indicated by the @author tags.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.keycloak.common.util;
|
||||
|
||||
import jakarta.ws.rs.WebApplicationException;
|
||||
import jakarta.ws.rs.core.Response;
|
||||
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
import org.keycloak.models.KeycloakSessionTaskWithResult;
|
||||
import org.keycloak.models.utils.KeycloakModelUtils;
|
||||
|
||||
/**
|
||||
* A {@link KeycloakSessionTaskWithResult} that is aimed to be used by endpoints that want to produce a {@link Response} in
|
||||
* a retriable transaction. It takes care of the boilerplate code that is common to be seen in this scenario, allowing the
|
||||
* endpoint to focus on the actual code that has to be executed in a retriable manner.
|
||||
* </p>
|
||||
* More specifically, this task:
|
||||
* <li>
|
||||
* <ul>pushes the task's session into the resteasy context, restoring the original value after the task is over. This allows
|
||||
* for endpoints to create new instances of themselves and inject the resteasy properties correctly;</ul>
|
||||
* <ul>sets up the task's session context, based on model values found in the original session's context;</ul>
|
||||
* <ul>handles {@link WebApplicationException} when it is thrown by the task.</ul>
|
||||
* </li>
|
||||
*
|
||||
* @author <a href="mailto:sguilhen@redhat.com">Stefan Guilhen</a>
|
||||
*/
|
||||
public abstract class ResponseSessionTask implements KeycloakSessionTaskWithResult<Response> {
|
||||
|
||||
private final KeycloakSession originalSession;
|
||||
|
||||
/**
|
||||
* Constructs a new instance of this task.
|
||||
*
|
||||
* @param originalSession the original {@link KeycloakSession} that was active when the task was created.
|
||||
*/
|
||||
public ResponseSessionTask(final KeycloakSession originalSession) {
|
||||
this.originalSession = originalSession;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Response run(final KeycloakSession session) {
|
||||
// save the session that was originally in the resteasy context, so it can be restored once the task finishes.
|
||||
KeycloakSession originalContextSession = Resteasy.getContextData(KeycloakSession.class);
|
||||
try {
|
||||
// set up the current session context based on the original session context.
|
||||
KeycloakModelUtils.cloneContextRealmClientSessionToSession(originalSession.getContext(), session);
|
||||
// push the current session into the resteasy context.
|
||||
Resteasy.pushContext(KeycloakSession.class, session);
|
||||
// run the actual task.
|
||||
return runInternal(session);
|
||||
} catch (WebApplicationException we) {
|
||||
// If the exception is capable of producing a complete response, including a message entity, we return the response
|
||||
// here so that the overall transaction is still committed. If the message entity is missing, we throw the exception
|
||||
// so that KeycloakError handler is invoked later on to produce a valid response and the transaction is rolled back.
|
||||
//
|
||||
// Another reason to convert the web application exception into a response here is because some exception subtypes use
|
||||
// the Keycloak session to construct the response. As a result, the conversion has to happen before the session is closed.
|
||||
Response response = we.getResponse();
|
||||
if (response.getEntity() != null) {
|
||||
return response;
|
||||
}
|
||||
throw we;
|
||||
} finally {
|
||||
// restore original session in resteasy context.
|
||||
Resteasy.pushContext(KeycloakSession.class, originalContextSession);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the response that is to be returned.
|
||||
*
|
||||
* @param session a reference the {@link KeycloakSession}.
|
||||
* @return the constructed {@link Response}.
|
||||
*/
|
||||
public abstract Response runInternal(final KeycloakSession session);
|
||||
}
|
Loading…
Reference in a new issue