Skip to content

Commit

Permalink
Merge pull request #5393 from jinjunoh/SWC-6770
Browse files Browse the repository at this point in the history
SWC-6770: migrate Provenance v2 visualization to feature flag
  • Loading branch information
jinjunoh committed May 23, 2024
2 parents e4ca220 + 2be70b1 commit 4e2b1cd
Show file tree
Hide file tree
Showing 15 changed files with 240 additions and 22 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package org.sagebionetworks.web.client;

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.cookie.CookieProvider;

public class FeatureFlagConfig {

CookieProvider cookieProvider;
private JSONObject config;

public FeatureFlagConfig(String json, CookieProvider cookieProvider) {
JSONValue parsed = JSONParser.parseStrict(json);
config = parsed.isObject();
this.cookieProvider = cookieProvider;
}

/**
* Constructor for testing with dependency injection
* The required native library for GWT is not available in JUnit
*/
public FeatureFlagConfig(JSONObject config, CookieProvider cookieProvider) {
this.config = config;
this.cookieProvider = cookieProvider;
}

public boolean isFeatureEnabled(String featureName) {
try {
return (
DisplayUtils.isInTestWebsite(cookieProvider) ||
config.get(featureName).isBoolean().booleanValue()
);
} catch (Exception e) {
return DisplayUtils.isInTestWebsite(cookieProvider);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.sagebionetworks.web.client;

import com.google.inject.Inject;
import com.google.inject.Provider;
import org.sagebionetworks.web.client.cookie.CookieProvider;
import org.sagebionetworks.web.shared.WebConstants;

public class FeatureFlagConfigProvider implements Provider<FeatureFlagConfig> {

CookieProvider cookieProvider;

@Inject
public FeatureFlagConfigProvider(CookieProvider cookieProvider) {
this.cookieProvider = cookieProvider;
}

@Override
public FeatureFlagConfig get() {
return new FeatureFlagConfig(
cookieProvider.getCookie(WebConstants.PORTAL_FEATURE_FLAG),
cookieProvider
);
}
}
15 changes: 15 additions & 0 deletions src/main/java/org/sagebionetworks/web/client/FeatureFlagKey.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.sagebionetworks.web.client;

public enum FeatureFlagKey {
PROVENANCE_V2_VISUALIZATION("Provenance v2 visualization");

private final String key;

FeatureFlagKey(String key) {
this.key = key;
}

public String getKey() {
return key;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1616,5 +1616,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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,8 @@
import org.sagebionetworks.schema.adapter.JSONObjectAdapter;
import org.sagebionetworks.schema.adapter.JSONObjectAdapterException;
import org.sagebionetworks.web.client.DisplayConstants;
import org.sagebionetworks.web.client.DisplayUtils;
import org.sagebionetworks.web.client.FeatureFlagConfig;
import org.sagebionetworks.web.client.FeatureFlagKey;
import org.sagebionetworks.web.client.PortalGinInjector;
import org.sagebionetworks.web.client.utils.Callback;
import org.sagebionetworks.web.client.widget.WidgetEditorPresenter;
Expand All @@ -101,14 +102,17 @@ public class WidgetRegistrarImpl implements WidgetRegistrar {

PortalGinInjector ginInjector;
JSONObjectAdapter adapter;
FeatureFlagConfig featureFlagConfig;

@Inject
public WidgetRegistrarImpl(
PortalGinInjector ginInjector,
JSONObjectAdapter adapter
JSONObjectAdapter adapter,
FeatureFlagConfig featureFlagConfig
) {
this.ginInjector = ginInjector;
this.adapter = adapter;
this.featureFlagConfig = featureFlagConfig;
initWithKnownWidgets();
}

Expand Down Expand Up @@ -326,7 +330,11 @@ public WidgetRendererPresenter getWidgetRendererForWidgetDescriptorAfterLazyLoad
} else if (contentTypeKey.equals(REFERENCE_CONTENT_TYPE)) {
presenter = ginInjector.getReferenceRenderer();
} else if (contentTypeKey.equals(PROVENANCE_CONTENT_TYPE)) {
if (DisplayUtils.isInTestWebsite(ginInjector.getCookieProvider())) {
if (
featureFlagConfig.isFeatureEnabled(
FeatureFlagKey.PROVENANCE_V2_VISUALIZATION.getKey()
)
) {
presenter = ginInjector.getProvenanceRendererV2();
} else {
presenter = ginInjector.getProvenanceRenderer();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
import org.sagebionetworks.repo.model.table.Table;
import org.sagebionetworks.web.client.DisplayUtils;
import org.sagebionetworks.web.client.EntityTypeUtils;
import org.sagebionetworks.web.client.FeatureFlagConfig;
import org.sagebionetworks.web.client.FeatureFlagKey;
import org.sagebionetworks.web.client.PortalGinInjector;
import org.sagebionetworks.web.client.SynapseJavascriptClient;
import org.sagebionetworks.web.client.events.EntityUpdatedEvent;
Expand Down Expand Up @@ -96,6 +98,7 @@ public abstract class AbstractTablesTab
WikiPageWidget wikiPageWidget;
Long latestSnapshotVersionNumber;
SynapseJavascriptClient jsClient;
FeatureFlagConfig featureFlagConfig;

protected abstract EntityArea getTabArea();

Expand All @@ -110,9 +113,14 @@ public abstract class AbstractTablesTab
protected abstract boolean isEntityShownInTab(Entity entity);

@Inject
public AbstractTablesTab(Tab tab, PortalGinInjector ginInjector) {
public AbstractTablesTab(
Tab tab,
PortalGinInjector ginInjector,
FeatureFlagConfig featureFlagConfig
) {
this.tab = tab;
this.ginInjector = ginInjector;
this.featureFlagConfig = featureFlagConfig;
}

public void configure(
Expand Down Expand Up @@ -306,7 +314,11 @@ protected void updateVersionAndAreaToken(
WidgetConstants.PROV_WIDGET_ENTITY_LIST_KEY,
DisplayUtils.createEntityVersionString(entityId, newVersion)
);
if (DisplayUtils.isInTestWebsite(ginInjector.getCookieProvider())) {
if (
featureFlagConfig.isFeatureEnabled(
FeatureFlagKey.PROVENANCE_V2_VISUALIZATION.getKey()
)
) {
ProvenanceWidget provWidget = ginInjector.getProvenanceRendererV2();
view.setProvenance(provWidget);
provWidget.configure(configMap);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import org.sagebionetworks.repo.model.table.EntityRefCollectionView;
import org.sagebionetworks.web.client.DisplayConstants;
import org.sagebionetworks.web.client.DisplayUtils;
import org.sagebionetworks.web.client.FeatureFlagConfig;
import org.sagebionetworks.web.client.PortalGinInjector;
import org.sagebionetworks.web.client.place.Synapse.EntityArea;
import org.sagebionetworks.web.shared.WebConstants;
Expand All @@ -30,10 +31,15 @@ public class DatasetsTab extends AbstractTablesTab {
"Use Datasets to produce and distribute an immutable set of files found across one or more Projects or Folders. ";

@Inject
public DatasetsTab(Tab tab, PortalGinInjector ginInjector) {
super(tab, ginInjector);
public DatasetsTab(
Tab tab,
PortalGinInjector ginInjector,
FeatureFlagConfig featureFlagConfig
) {
super(tab, ginInjector, featureFlagConfig);
this.tab = tab;
this.ginInjector = ginInjector;
this.featureFlagConfig = featureFlagConfig;
String help = DisplayUtils.isInTestWebsite(ginInjector.getCookieProvider())
? DATASETS_AND_COLLECTIONS_HELP
: DATASETS_HELP;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
import org.sagebionetworks.repo.model.VersionableEntity;
import org.sagebionetworks.repo.model.entitybundle.v2.EntityBundle;
import org.sagebionetworks.web.client.DisplayUtils;
import org.sagebionetworks.web.client.FeatureFlagConfig;
import org.sagebionetworks.web.client.FeatureFlagKey;
import org.sagebionetworks.web.client.GlobalApplicationState;
import org.sagebionetworks.web.client.PortalGinInjector;
import org.sagebionetworks.web.client.SynapseClientAsync;
Expand Down Expand Up @@ -67,11 +69,17 @@ public class FilesTab {
CallbackP<String> entitySelectedCallback;
ProvenanceWidget provWidget;
AddToDownloadListV2 addToDownloadListWidget;
FeatureFlagConfig featureFlagConfig;

@Inject
public FilesTab(Tab tab, PortalGinInjector ginInjector) {
public FilesTab(
Tab tab,
PortalGinInjector ginInjector,
FeatureFlagConfig featureFlagConfig
) {
this.tab = tab;
this.ginInjector = ginInjector;
this.featureFlagConfig = featureFlagConfig;
tab.configure(
"Files",
"file",
Expand Down Expand Up @@ -311,7 +319,11 @@ public void setTargetBundle(EntityBundle bundle, final Long versionNumber) {
);
view.setProvenanceVisible(isFile);
if (isFile) {
if (DisplayUtils.isInTestWebsite(ginInjector.getCookieProvider())) {
if (
featureFlagConfig.isFeatureEnabled(
FeatureFlagKey.PROVENANCE_V2_VISUALIZATION.getKey()
)
) {
provWidget = ginInjector.getProvenanceRendererV2();
view.setProvenance(provWidget.asWidget());
provWidget.configure(configMap);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import org.sagebionetworks.repo.model.table.Dataset;
import org.sagebionetworks.repo.model.table.Table;
import org.sagebionetworks.web.client.DisplayConstants;
import org.sagebionetworks.web.client.FeatureFlagConfig;
import org.sagebionetworks.web.client.PortalGinInjector;
import org.sagebionetworks.web.client.place.Synapse.EntityArea;
import org.sagebionetworks.web.shared.WebConstants;
Expand All @@ -23,10 +24,15 @@ public class TablesTab extends AbstractTablesTab {
WebConstants.DOCS_URL + "Tables.2011038095.html";

@Inject
public TablesTab(Tab tab, PortalGinInjector ginInjector) {
super(tab, ginInjector);
public TablesTab(
Tab tab,
PortalGinInjector ginInjector,
FeatureFlagConfig featureFlagConfig
) {
super(tab, ginInjector, featureFlagConfig);
this.tab = tab;
this.ginInjector = ginInjector;
this.featureFlagConfig = featureFlagConfig;
tab.configure(
DisplayConstants.TABLES,
"table",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public void startConfigurationSession() {
appConfigDataClient.startConfigurationSession(sessionRequest);
configurationToken = sessionResponse.getInitialConfigurationToken();
} catch (Exception e) {
logger.log(Level.SEVERE, "Error starting configuration session", e);
logger.log(Level.WARNING, "Error starting configuration session", e);
configurationToken = null;
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package org.sagebionetworks.web.client;

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;

import com.google.gwt.json.client.JSONBoolean;
import com.google.gwt.json.client.JSONObject;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.sagebionetworks.web.client.cookie.CookieProvider;

public class FeatureFlagConfigTest {

@Mock
CookieProvider mockCookieProvider;

@Mock
JSONObject mockJsonObject;

private FeatureFlagConfig featureFlagConfig;
private static final String FEATURE_NAME = "testFeature";

@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}

@Test
public void testFeatureEnabled() {
when(mockJsonObject.get(FEATURE_NAME))
.thenReturn(JSONBoolean.getInstance(true));
featureFlagConfig =
new FeatureFlagConfig(mockJsonObject, mockCookieProvider);

assertTrue(featureFlagConfig.isFeatureEnabled(FEATURE_NAME));
}

@Test
public void testFeatureDisabled() {
when(mockJsonObject.get(FEATURE_NAME))
.thenReturn(JSONBoolean.getInstance(false));
featureFlagConfig =
new FeatureFlagConfig(mockJsonObject, mockCookieProvider);

assertFalse(featureFlagConfig.isFeatureEnabled(FEATURE_NAME));
}

@Test
public void testFeatureDisabledButExperimentalModeEnabled() {
when(mockCookieProvider.getCookie(eq("SynapseTestWebsite")))
.thenReturn("true");
when(mockJsonObject.get(FEATURE_NAME))
.thenReturn(JSONBoolean.getInstance(false));
featureFlagConfig =
new FeatureFlagConfig(mockJsonObject, mockCookieProvider);

assertTrue(featureFlagConfig.isFeatureEnabled(FEATURE_NAME));
}

@Test
public void testExperimentalModeValueReturnedOnException() {
when(mockJsonObject.get(FEATURE_NAME))
.thenThrow(new RuntimeException("Test exception"));
when(mockCookieProvider.getCookie(eq("SynapseTestWebsite")))
.thenReturn("true");
featureFlagConfig =
new FeatureFlagConfig(mockJsonObject, mockCookieProvider);

assertTrue(featureFlagConfig.isFeatureEnabled(FEATURE_NAME));
}
}
Loading

0 comments on commit 4e2b1cd

Please sign in to comment.