From 2fb2fb6f8556a113bc3ef4523f5c41088b2d9ee8 Mon Sep 17 00:00:00 2001 From: Jay Hodgson Date: Wed, 14 Aug 2024 17:29:56 -0700 Subject: [PATCH 1/2] SWC-7030 --- .../web/client/FeatureFlagConfig.java | 17 +- .../web/client/FeatureFlagConfigProvider.java | 32 --- .../sagebionetworks/web/client/Portal.java | 192 +++++++++--------- .../web/client/PortalGinInjector.java | 2 + .../web/client/PortalGinModule.java | 3 +- .../web/shared/WebConstants.java | 2 - 6 files changed, 116 insertions(+), 132 deletions(-) delete mode 100644 src/main/java/org/sagebionetworks/web/client/FeatureFlagConfigProvider.java diff --git a/src/main/java/org/sagebionetworks/web/client/FeatureFlagConfig.java b/src/main/java/org/sagebionetworks/web/client/FeatureFlagConfig.java index 20450c145c..88ad8793f2 100644 --- a/src/main/java/org/sagebionetworks/web/client/FeatureFlagConfig.java +++ b/src/main/java/org/sagebionetworks/web/client/FeatureFlagConfig.java @@ -3,18 +3,25 @@ import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONParser; import com.google.gwt.json.client.JSONValue; -import org.sagebionetworks.web.client.cache.SessionStorage; +import com.google.inject.Inject; import org.sagebionetworks.web.client.cookie.CookieProvider; public class FeatureFlagConfig { private final CookieProvider cookieProvider; - private final JSONObject config; + private JSONObject config; - public FeatureFlagConfig(String json, CookieProvider cookieProvider) { - JSONValue parsed = JSONParser.parseStrict(json); - config = parsed.isObject(); + @Inject + public FeatureFlagConfig(CookieProvider cookieProvider) { this.cookieProvider = cookieProvider; + config = new JSONObject(); + } + + public void setJson(String json) { + if (json != null) { + JSONValue parsed = JSONParser.parseStrict(json); + config = parsed.isObject(); + } } /** diff --git a/src/main/java/org/sagebionetworks/web/client/FeatureFlagConfigProvider.java b/src/main/java/org/sagebionetworks/web/client/FeatureFlagConfigProvider.java deleted file mode 100644 index c429f64065..0000000000 --- a/src/main/java/org/sagebionetworks/web/client/FeatureFlagConfigProvider.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.sagebionetworks.web.client; - -import com.google.inject.Inject; -import com.google.inject.Provider; -import org.sagebionetworks.web.client.cache.SessionStorage; -import org.sagebionetworks.web.client.cookie.CookieProvider; -import org.sagebionetworks.web.shared.WebConstants; - -public class FeatureFlagConfigProvider implements Provider { - - private final CookieProvider cookieProvider; - private final SessionStorage sessionStorage; - - @Inject - public FeatureFlagConfigProvider( - CookieProvider cookieProvider, - SessionStorage sessionStorage - ) { - this.cookieProvider = cookieProvider; - this.sessionStorage = sessionStorage; - } - - @Override - public FeatureFlagConfig get() { - return new FeatureFlagConfig( - sessionStorage.getItem( - WebConstants.PORTAL_FEATURE_FLAG_SESSION_STORAGE_KEY - ), - cookieProvider - ); - } -} diff --git a/src/main/java/org/sagebionetworks/web/client/Portal.java b/src/main/java/org/sagebionetworks/web/client/Portal.java index 046fdf6ec8..2443eeb0b8 100644 --- a/src/main/java/org/sagebionetworks/web/client/Portal.java +++ b/src/main/java/org/sagebionetworks/web/client/Portal.java @@ -19,7 +19,6 @@ import org.sagebionetworks.web.client.utils.Callback; import org.sagebionetworks.web.client.widget.footer.Footer; import org.sagebionetworks.web.client.widget.header.Header; -import org.sagebionetworks.web.shared.WebConstants; /** * Entry point classes define onModuleLoad(). @@ -82,6 +81,7 @@ public void onSuccess() { // make sure jsni utils code is available to the client ginjector.getSynapseJSNIUtils(); + // initialize feature flag config ginjector .getSynapseJavascriptClient() .getFeatureFlagConfig( @@ -89,11 +89,9 @@ public void onSuccess() { @Override public void onSuccess(JSONObjectAdapter config) { ginjector - .getSessionStorage() - .setItem( - WebConstants.PORTAL_FEATURE_FLAG_SESSION_STORAGE_KEY, - config.toString() - ); + .getFeatureFlagConfig() + .setJson(config.toString()); + continueInit(); } @Override @@ -102,100 +100,112 @@ public void onFailure(Throwable reason) { "Error getting feature flag configuration:" + reason.getMessage() ); + continueInit(); } - } - ); - - ginjector - .getSynapseProperties() - .initSynapseProperties(() -> { - EventBus eventBus = ginjector.getEventBus(); - PlaceController placeController = new PlaceController( - eventBus - ); - // Start ActivityManager for the main widget with our ActivityMapper - AppActivityMapper activityMapper = new AppActivityMapper( - ginjector, - new SynapseJSNIUtilsImpl(), - null - ); - ActivityManager activityManager = new ActivityManager( - activityMapper, - eventBus - ); - activityManager.setDisplay(appWidget); + private void continueInit() { + ginjector + .getSynapseProperties() + .initSynapseProperties(() -> { + EventBus eventBus = ginjector.getEventBus(); + PlaceController placeController = new PlaceController( + eventBus + ); - // All pages get added to the root panel - appWidget.addStyleName("rootPanel"); + // Start ActivityManager for the main widget with our ActivityMapper + AppActivityMapper activityMapper = + new AppActivityMapper( + ginjector, + new SynapseJSNIUtilsImpl(), + null + ); + ActivityManager activityManager = new ActivityManager( + activityMapper, + eventBus + ); + activityManager.setDisplay(appWidget); - // Start PlaceHistoryHandler with our PlaceHistoryMapper - AppPlaceHistoryMapper historyMapper = GWT.create( - AppPlaceHistoryMapper.class - ); - final PlaceHistoryHandler historyHandler = - new PlaceHistoryHandler( - historyMapper, - new Html5Historian() - ); - historyHandler.register( - placeController, - eventBus, - AppActivityMapper.getDefaultPlace() - ); - Header header = ginjector.getHeader(); - RootPanel.get("headerPanel").add(header); - Footer footer = ginjector.getFooter(); - RootPanel.get("footerPanel").add(footer); + // All pages get added to the root panel + appWidget.addStyleName("rootPanel"); - RootPanel.get("rootPanel").add(appWidget); - RootPanel.get("initialLoadingUI").setVisible(false); - fullOpacity( - RootPanel.get("headerPanel"), - RootPanel.get("rootPanel") - ); - final GlobalApplicationState globalApplicationState = - ginjector.getGlobalApplicationState(); - globalApplicationState.setPlaceController(placeController); - globalApplicationState.setAppPlaceHistoryMapper( - historyMapper - ); - ginjector - .getAuthenticationController() - .checkForUserChange(() -> { - globalApplicationState.init( - new Callback() { - @Override - public void invoke() { - // listen for window close (or navigating away) - registerWindowClosingHandler( - globalApplicationState + // Start PlaceHistoryHandler with our PlaceHistoryMapper + AppPlaceHistoryMapper historyMapper = GWT.create( + AppPlaceHistoryMapper.class + ); + final PlaceHistoryHandler historyHandler = + new PlaceHistoryHandler( + historyMapper, + new Html5Historian() ); - registerOnPopStateHandler(globalApplicationState); + historyHandler.register( + placeController, + eventBus, + AppActivityMapper.getDefaultPlace() + ); + Header header = ginjector.getHeader(); + RootPanel.get("headerPanel").add(header); + Footer footer = ginjector.getFooter(); + RootPanel.get("footerPanel").add(footer); - // start version timer - ginjector.getVersionTimer().start(); - // start timer to check for Synapse outage or scheduled maintenance - ginjector.getSynapseStatusDetector().start(); - // Goes to place represented on URL or default place - historyHandler.handleCurrentHistory(); - globalApplicationState.initializeDropZone(); - globalApplicationState.initializeToastContainer(); - // initialize the view default columns so that they're ready when we need them (do this by constructing that singleton object) - ginjector.getViewDefaultColumns(); + RootPanel.get("rootPanel").add(appWidget); + RootPanel.get("initialLoadingUI").setVisible(false); + fullOpacity( + RootPanel.get("headerPanel"), + RootPanel.get("rootPanel") + ); + final GlobalApplicationState globalApplicationState = + ginjector.getGlobalApplicationState(); + globalApplicationState.setPlaceController( + placeController + ); + globalApplicationState.setAppPlaceHistoryMapper( + historyMapper + ); + ginjector + .getAuthenticationController() + .checkForUserChange(() -> { + globalApplicationState.init( + new Callback() { + @Override + public void invoke() { + // listen for window close (or navigating away) + registerWindowClosingHandler( + globalApplicationState + ); + registerOnPopStateHandler( + globalApplicationState + ); - // start timer to check for user session state change (session expired, or user explicitly logged - // out). Backend endpoints must be set before starting this (because it attempts to get "my user profile") - ginjector.getSessionDetector().start(); + // start version timer + ginjector.getVersionTimer().start(); + // start timer to check for Synapse outage or scheduled maintenance + ginjector + .getSynapseStatusDetector() + .start(); + // Goes to place represented on URL or default place + historyHandler.handleCurrentHistory(); + globalApplicationState.initializeDropZone(); + globalApplicationState.initializeToastContainer(); + // initialize the view default columns so that they're ready when we need them (do this by constructing that singleton object) + ginjector.getViewDefaultColumns(); - // start a timer to check to see if we're approaching the max allowable space in the web storage. - // clears out the web storage (cache) if this is the case. - ginjector.getWebStorageMaxSizeDetector().start(); - } - } - ); - }); - }); + // start timer to check for user session state change (session expired, or user explicitly logged + // out). Backend endpoints must be set before starting this (because it attempts to get "my user profile") + ginjector.getSessionDetector().start(); + + // start a timer to check to see if we're approaching the max allowable space in the web storage. + // clears out the web storage (cache) if this is the case. + ginjector + .getWebStorageMaxSizeDetector() + .start(); + } + } + ); + }); + }); + } + } + ); } catch (Throwable e) { onFailure(e); } diff --git a/src/main/java/org/sagebionetworks/web/client/PortalGinInjector.java b/src/main/java/org/sagebionetworks/web/client/PortalGinInjector.java index b53bd9aca5..bf56785a08 100644 --- a/src/main/java/org/sagebionetworks/web/client/PortalGinInjector.java +++ b/src/main/java/org/sagebionetworks/web/client/PortalGinInjector.java @@ -868,4 +868,6 @@ public interface PortalGinInjector extends Ginjector { ColumnModelsEditorWidget getColumnModelsEditorWidget(); EntityTypeIcon getEntityTypeIcon(); + + FeatureFlagConfig getFeatureFlagConfig(); } diff --git a/src/main/java/org/sagebionetworks/web/client/PortalGinModule.java b/src/main/java/org/sagebionetworks/web/client/PortalGinModule.java index db7ba706e6..4ff45a1a74 100644 --- a/src/main/java/org/sagebionetworks/web/client/PortalGinModule.java +++ b/src/main/java/org/sagebionetworks/web/client/PortalGinModule.java @@ -973,9 +973,8 @@ protected void configure() { bind(KeyFactoryProvider.class).to(KeyFactoryProviderImpl.class); bind(SRCUploadFileWrapper.class).to(SRCUploadFileWrapperImpl.class); - bind(FeatureFlagConfigProvider.class).in(Singleton.class); - bind(FeatureFlagConfig.class).toProvider(FeatureFlagConfigProvider.class); + bind(FeatureFlagConfig.class).in(Singleton.class); bind(EntityTypeIcon.class).to(EntityTypeIconImpl.class); } } diff --git a/src/main/java/org/sagebionetworks/web/shared/WebConstants.java b/src/main/java/org/sagebionetworks/web/shared/WebConstants.java index d8b533e040..d75b0437c4 100644 --- a/src/main/java/org/sagebionetworks/web/shared/WebConstants.java +++ b/src/main/java/org/sagebionetworks/web/shared/WebConstants.java @@ -411,8 +411,6 @@ public class WebConstants { "User requests that the Synapse Access and Compliance Team send them information on how to access this data."; public static final String ISSUE_PRIORITY_MINOR = "4"; public static final String ANONYMOUS = "Anonymous"; - public static final String PORTAL_FEATURE_FLAG_SESSION_STORAGE_KEY = - "portal_feature_flag"; // report Synapse error public static final String SWC_ISSUE_COLLECTOR_URL = From 03cdecf5903c8540972871469c8c9e5e18c37636 Mon Sep 17 00:00:00 2001 From: Jay Hodgson Date: Wed, 14 Aug 2024 17:40:52 -0700 Subject: [PATCH 2/2] clean import --- .../web/unitclient/widget/entity/tabs/TablesTabTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/org/sagebionetworks/web/unitclient/widget/entity/tabs/TablesTabTest.java b/src/test/java/org/sagebionetworks/web/unitclient/widget/entity/tabs/TablesTabTest.java index d1c41738e3..687ab5c2b9 100644 --- a/src/test/java/org/sagebionetworks/web/unitclient/widget/entity/tabs/TablesTabTest.java +++ b/src/test/java/org/sagebionetworks/web/unitclient/widget/entity/tabs/TablesTabTest.java @@ -47,7 +47,6 @@ import org.sagebionetworks.repo.model.table.TableEntity; import org.sagebionetworks.web.client.DisplayUtils; import org.sagebionetworks.web.client.FeatureFlagConfig; -import org.sagebionetworks.web.client.FeatureFlagConfigProvider; import org.sagebionetworks.web.client.GlobalApplicationState; import org.sagebionetworks.web.client.PlaceChanger; import org.sagebionetworks.web.client.PortalGinInjector;