Alexander Wels has uploaded a new change for review. Change subject: webadmin: Store rest api session id in http session ......................................................................
webadmin: Store rest api session id in http session - REST API stores a session id for the UI plugins. Moved the session id location from LocalStorage to HTTP session. Change-Id: I6fe9af54054aefe694876b1805a4a44f9bba0482 Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1077448 Signed-off-by: Alexander Wels <[email protected]> --- M frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/Frontend.java M frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/CommunicationProvider.java M frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/GWTRPCCommunicationProvider.java M frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/OperationProcessor.java A frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/StorageCallback.java M frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/VdcOperationManager.java M frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/gwtservices/GenericApiGWTService.java M frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/server/gwt/GenericApiGWTServiceImpl.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/plugin/restapi/RestApiSessionManager.java 9 files changed, 183 insertions(+), 10 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/07/26807/1 diff --git a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/Frontend.java b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/Frontend.java index dceea50..527d2bf 100644 --- a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/Frontend.java +++ b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/Frontend.java @@ -20,6 +20,7 @@ import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.ui.frontend.communication.RefreshActiveModelEvent; +import org.ovirt.engine.ui.frontend.communication.StorageCallback; import org.ovirt.engine.ui.frontend.communication.UserCallback; import org.ovirt.engine.ui.frontend.communication.VdcOperation; import org.ovirt.engine.ui.frontend.communication.VdcOperationCallback; @@ -632,7 +633,7 @@ /** * A convenience method that calls {@link #runMultipleActions(VdcActionType, List, List, Object)} with - * running callbacks even on empty run + * running callbacks even on empty run. * * @param actionType The action to be repeated. * @param parameters The parameters of each action. @@ -877,6 +878,14 @@ } } + public void storeInHttpSession(final String key, final String value) { + getOperationManager().storeInHttpSession(key, value); + } + + public void retrieveFromHttpSession(final String key, final StorageCallback callback) { + getOperationManager().retrieveFromHttpSession(key, callback); + } + // TODO: Externalize to a better location, should support translation via // resource bundle file. /** diff --git a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/CommunicationProvider.java b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/CommunicationProvider.java index 796462e..680a2f0 100644 --- a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/CommunicationProvider.java +++ b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/CommunicationProvider.java @@ -31,4 +31,19 @@ */ void logout(Object userObject, UserCallback<?> callback); + /** + * Store a {@code String} key value pair in the {@code HttpSession} on the server side. As a result these keys + * will not be persisted across engine server restarts. + * @param key The key. + * @param value The value. + * @param callback The callback to call once the value has been stored. + */ + void storeInHttpSession(String key, String value, StorageCallback callback); + + /** + * Retrieve the value associated with the key from the {@code HttpSession} on the server side. + * @param key The key + * @param the callback to call with the result. + */ + void retrieveFromHttpSession(String key, StorageCallback callback); } diff --git a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/GWTRPCCommunicationProvider.java b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/GWTRPCCommunicationProvider.java index a3d8f23..7d67fed 100644 --- a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/GWTRPCCommunicationProvider.java +++ b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/GWTRPCCommunicationProvider.java @@ -379,4 +379,33 @@ }); } + @Override + public void storeInHttpSession(final String key, final String value, final StorageCallback callback) { + getService().storeInHttpSession(key, value, new AsyncCallback<Void>() { + @Override + public void onSuccess(final Void result) { + callback.onSuccess(null); + } + + @Override + public void onFailure(final Throwable caught) { + callback.onFailure(caught); + } + }); + } + + @Override + public void retrieveFromHttpSession(final String key, final StorageCallback callback) { + getService().retrieveFromHttpSession(key, new AsyncCallback<String>() { + @Override + public void onSuccess(final String result) { + callback.onSuccess(result); + } + + @Override + public void onFailure(final Throwable caught) { + callback.onFailure(caught); + } + }); + } } diff --git a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/OperationProcessor.java b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/OperationProcessor.java index 09824d8..3e31a59 100644 --- a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/OperationProcessor.java +++ b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/OperationProcessor.java @@ -267,4 +267,32 @@ communicationProvider.logout(userObject, callback); } + /** + * Default store where the caller doesn't care about the result. + * @param key The key + * @param value The value to store. + */ + public void storeInHttpSession(final String key, final String value) { + storeInHttpSession(key, value, new StorageCallback() { + + @Override + public void onSuccess(String result) { + // Do nothing + } + + @Override + public void onFailure(Throwable caught) { + //Do nothing + } + + }); + } + + public void storeInHttpSession(final String key, final String value, final StorageCallback callback) { + communicationProvider.storeInHttpSession(key, value, callback); + } + + public void retrieveFromHttpSession(final String key, final StorageCallback callback) { + communicationProvider.retrieveFromHttpSession(key, callback); + } } diff --git a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/StorageCallback.java b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/StorageCallback.java new file mode 100644 index 0000000..15f8cbd --- /dev/null +++ b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/StorageCallback.java @@ -0,0 +1,15 @@ +package org.ovirt.engine.ui.frontend.communication; + +public interface StorageCallback { + /** + * Success callback. + * @param result Either the value, or null if there is no value to return. + */ + void onSuccess(String result); + + /** + * Failure callback. + * @param caught Any exceptions caught during the processing of the operation. + */ + void onFailure(Throwable caught); +} diff --git a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/VdcOperationManager.java b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/VdcOperationManager.java index 22ef675..2c00dd2 100644 --- a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/VdcOperationManager.java +++ b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/VdcOperationManager.java @@ -152,4 +152,21 @@ loggedIn = isLoggedIn; } + /** + * Store a value on the back-end in the session. + * @param key The key. + * @param value The value. + */ + public void storeInHttpSession(final String key, final String value) { + processor.storeInHttpSession(key, value); + } + + /** + * Retrieve a stored value from the back-end session. + * @param key The key. + * @param callback The callback to call with the value. + */ + public void retrieveFromHttpSession(final String key, final StorageCallback callback) { + processor.retrieveFromHttpSession(key, callback); + } } diff --git a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/gwtservices/GenericApiGWTService.java b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/gwtservices/GenericApiGWTService.java index 69d102d..8e4036b 100644 --- a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/gwtservices/GenericApiGWTService.java +++ b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/gwtservices/GenericApiGWTService.java @@ -45,4 +45,7 @@ public VdcReturnValueBase Login(String userName, String password, String profileName, VdcActionType loginType); + public void storeInHttpSession(String key, String value); + + public String retrieveFromHttpSession(String key); } diff --git a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/server/gwt/GenericApiGWTServiceImpl.java b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/server/gwt/GenericApiGWTServiceImpl.java index 68979c0..398f738 100644 --- a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/server/gwt/GenericApiGWTServiceImpl.java +++ b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/server/gwt/GenericApiGWTServiceImpl.java @@ -33,6 +33,8 @@ private static final Logger log = Logger.getLogger(GenericApiGWTServiceImpl.class); + private static final String UI_PREFIX = "UI_"; //$NON-NLS-1$ + private BackendLocal backend; @EJB(beanInterface = BackendLocal.class, @@ -186,6 +188,27 @@ } @Override + public void storeInHttpSession(String key, String value) { + HttpServletRequest request = this.getThreadLocalRequest(); + HttpSession session = request.getSession(); + session.setAttribute(UI_PREFIX + key, value); + } + + @Override + public String retrieveFromHttpSession(String key) { + HttpServletRequest request = this.getThreadLocalRequest(); + HttpSession session = request.getSession(); + Object value = session.getAttribute(UI_PREFIX + key); + String result = null; + if (value instanceof String) { + result = (String)value; + } else { + log.error("Retrieving non string value from session"); //$NON-NLS-1$ + } + return result; + } + + @Override protected void doUnexpectedFailure(Throwable error) { // If the user is using a version of the application different to what // the server expects the names of the RPC serialization policy files diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/plugin/restapi/RestApiSessionManager.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/plugin/restapi/RestApiSessionManager.java index eaf785f..2605af5 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/plugin/restapi/RestApiSessionManager.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/plugin/restapi/RestApiSessionManager.java @@ -4,6 +4,8 @@ import java.util.logging.Logger; import org.ovirt.engine.ui.common.system.ClientStorage; +import org.ovirt.engine.ui.frontend.Frontend; +import org.ovirt.engine.ui.frontend.communication.StorageCallback; import org.ovirt.engine.ui.frontend.utils.BaseContextPathData; import com.google.gwt.core.client.Scheduler; @@ -71,6 +73,8 @@ private final String restApiBaseUrl; private String sessionTimeout; + + private String restApiSessionId; @Inject public RestApiSessionManager(EventBus eventBus, ClientStorage clientStorage) { @@ -159,14 +163,39 @@ * Attempts to reuse existing REST API session that was previously {@linkplain #acquireSession acquired}. */ public void reuseSession() { - String sessionId = getSessionId(); - - if (sessionId != null) { - RestApiSessionAcquiredEvent.fire(eventBus, sessionId); - scheduleKeepAliveHeartbeat(); + //If reuseSession is called right after setSessionId, then getSessionId() without the callback will not + //be null. If it is null then reuseSession was called from an automatic login (as restApiSessionId is null + //can we can utilize the async call to retrieve it from the backend. + if (getSessionId() != null) { + processSessionId(getSessionId()); } else { - RestApiSessionManager.logger.severe("Engine REST API session ID is not available"); //$NON-NLS-1$ + getSessionId(new StorageCallback() { + + @Override + public void onSuccess(String result) { + if (result != null) { + restApiSessionId = result; + processSessionId(result); + } else { + processSessionIdException(); + } + } + + @Override + public void onFailure(Throwable caught) { + processSessionIdException(); + } + + private void processSessionIdException() { + RestApiSessionManager.logger.severe("Engine REST API session ID is not available"); //$NON-NLS-1$ + } + }); } + } + + private void processSessionId(String sessionId) { + RestApiSessionAcquiredEvent.fire(eventBus, sessionId); + scheduleKeepAliveHeartbeat(); } /** @@ -177,15 +206,20 @@ } String getSessionId() { - return clientStorage.getLocalItem(SESSION_ID_KEY); + return restApiSessionId; + } + + void getSessionId(final StorageCallback callback) { + Frontend.getInstance().retrieveFromHttpSession(SESSION_ID_KEY, callback); } void setSessionId(String sessionId) { - clientStorage.setLocalItem(SESSION_ID_KEY, sessionId); + Frontend.getInstance().storeInHttpSession(SESSION_ID_KEY, sessionId); + restApiSessionId = sessionId; } void clearSessionId() { - clientStorage.removeLocalItem(SESSION_ID_KEY); + setSessionId(null); } } -- To view, visit http://gerrit.ovirt.org/26807 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I6fe9af54054aefe694876b1805a4a44f9bba0482 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.4 Gerrit-Owner: Alexander Wels <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
