Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion api/src/org/labkey/api/action/SpringActionController.java
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,7 @@ protected User getUser()
// Convenience method
protected static <P extends UrlProvider> P urlProvider(Class<P> inter)
{
return Objects.requireNonNull(PageFlowUtil.urlProvider(inter));
return PageFlowUtil.urlProvider(inter);
}

protected void requiresLogin()
Expand Down
23 changes: 7 additions & 16 deletions api/src/org/labkey/api/action/UrlProviderService.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@
import org.jetbrains.annotations.Nullable;
import org.labkey.api.module.Module;
import org.labkey.api.util.Pair;
import org.labkey.api.util.UnexpectedException;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
Expand All @@ -27,25 +29,19 @@
public class UrlProviderService
{
private static final UrlProviderService instance = new UrlProviderService();
private static final Map<Class, Class<? extends UrlProvider>> _urlProviderToImpl = new HashMap<>();
private static final Map<Class<?>, Class<? extends UrlProvider>> _urlProviderToImpl = new HashMap<>();
private static final Map<Class<? extends UrlProvider>, List<Pair<Module, UrlProvider>>> _urlProviderToOverrideImpls = new HashMap<>();

public static UrlProviderService getInstance()
{
return instance;
}

public <P extends UrlProvider> void registerUrlProvider(Class<P> inter, Class innerClass)
public <P extends UrlProvider> void registerUrlProvider(Class<P> inter, Class<? extends UrlProvider> innerClass)
{
_urlProviderToImpl.put(inter, innerClass);
}

/** @return true if the UrlProvider exists. */
public <P extends UrlProvider> boolean hasUrlProvider(Class<P> inter)
{
return _urlProviderToImpl.get(inter) != null;
}

@Nullable
public <P extends UrlProvider> P getUrlProvider(Class<P> inter)
{
Expand All @@ -56,16 +52,11 @@ public <P extends UrlProvider> P getUrlProvider(Class<P> inter)

try
{
P impl = (P) clazz.newInstance();
return impl;
}
catch (InstantiationException e)
{
throw new RuntimeException("Failed to instantiate provider class " + clazz.getName() + " for " + inter.getName(), e);
return (P) clazz.getDeclaredConstructor().newInstance();
}
catch (IllegalAccessException e)
catch (InstantiationException | InvocationTargetException | IllegalAccessException | NoSuchMethodException e)
{
throw new RuntimeException("Illegal access of provider class " + clazz.getName() + " for " + inter.getName(), e);
throw UnexpectedException.wrap(e, "Failed to instantiate provider class " + clazz.getName() + " for " + inter.getName());
}
}

Expand Down
2 changes: 1 addition & 1 deletion api/src/org/labkey/api/assay/AssayRunType.java
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public void populateButtonBar(ViewContext context, ButtonBar bar, DataView view,
Domain domain = provider.getResultsDomain(_protocol);
if (domain != null && domain.getTypeId() > 0)
{
StudyUrls urls = PageFlowUtil.urlProvider(StudyUrls.class);
StudyUrls urls = PageFlowUtil.urlProviderOptional(StudyUrls.class);

if (null != urls)
{
Expand Down
2 changes: 1 addition & 1 deletion api/src/org/labkey/api/assay/query/ResultsQueryView.java
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ private ActionButton getLinkToStudyButton(DataView view, Container container)
if (null == StudyPublishService.get() || StudyPublishService.get().getValidPublishTargets(getUser(), InsertPermission.class).isEmpty())
return null;

StudyUrls urls = PageFlowUtil.urlProvider(StudyUrls.class);
StudyUrls urls = PageFlowUtil.urlProviderOptional(StudyUrls.class);
if (urls == null)
return null;

Expand Down
2 changes: 1 addition & 1 deletion api/src/org/labkey/api/data/DataRegion.java
Original file line number Diff line number Diff line change
Expand Up @@ -1450,7 +1450,7 @@ protected JSONObject toJSON(RenderContext ctx)
ignoreViewFilter = getSettings().getIgnoreViewFilter();
dataRegionJSON.put("ignoreViewFilter", ignoreViewFilter);

VisualizationUrls visUrlProvider = PageFlowUtil.urlProvider(VisualizationUrls.class);
VisualizationUrls visUrlProvider = PageFlowUtil.urlProviderOptional(VisualizationUrls.class);
if (visUrlProvider != null)
dataRegionJSON.put("chartWizardURL", visUrlProvider.getGenericChartDesignerURL(ctx.getContainer(), user, getSettings(), null));

Expand Down
2 changes: 1 addition & 1 deletion api/src/org/labkey/api/exp/LsidManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ public AssayResultIdentifiable(AssayProvider provider, OntologyObject oo, ExpPro
@Override
public @Nullable ActionURL detailsURL()
{
var urls = PageFlowUtil.urlProvider(AssayUrls.class);
var urls = PageFlowUtil.urlProviderOptional(AssayUrls.class);
if (urls == null)
return null;

Expand Down
8 changes: 1 addition & 7 deletions api/src/org/labkey/api/jsp/JspBase.java
Original file line number Diff line number Diff line change
Expand Up @@ -422,20 +422,14 @@ public ActionURL urlFor(Class<? extends Controller> actionClass)
return new ActionURL(actionClass, getContainer());
}

/** @return true if the UrlProvider exists. */
public <P extends UrlProvider> boolean hasUrlProvider(Class<P> inter)
{
return PageFlowUtil.hasUrlProvider(inter);
}

/**
* Convenience function for getting a specified <code>UrlProvider</code> interface
* implementation, for use in writing URLs implemented in other modules.
*
* @param inter interface extending UrlProvider
* @return an implementation of the interface
*/
@Nullable
@NotNull
public <P extends UrlProvider> P urlProvider(Class<P> inter)
{
return PageFlowUtil.urlProvider(inter);
Expand Down
8 changes: 4 additions & 4 deletions api/src/org/labkey/api/module/ModuleLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -2217,7 +2217,7 @@ public void initControllerToModule()
{
Class<?>[] supr = inter.getInterfaces();
if (supr.length == 1 && UrlProvider.class.equals(supr[0]))
UrlProviderService.getInstance().registerUrlProvider((Class<UrlProvider>) inter, innerClass);
UrlProviderService.getInstance().registerUrlProvider((Class<UrlProvider>) inter, (Class<? extends UrlProvider>) innerClass);
}
}
}
Expand Down Expand Up @@ -2323,7 +2323,7 @@ private void registerResourcePrefix(String prefix, String name, String sourcePat
return;

ResourceFinder finder = new ResourceFinder(name, sourcePath, buildPath);
Collection<ResourceFinder> col = _resourceFinders.computeIfAbsent(prefix, k -> new ArrayList<>());
Collection<ResourceFinder> col = _resourceFinders.computeIfAbsent(prefix, _ -> new ArrayList<>());

synchronized (col)
{
Expand All @@ -2334,8 +2334,8 @@ private void registerResourcePrefix(String prefix, String name, String sourcePat
public @NotNull Collection<ResourceFinder> getResourceFindersForPath(String path)
{
//NOTE: jasper encodes underscores and dashes in JSPs, so decode them here
path = path.replaceAll("_005f", "_");
path = path.replaceAll("_002d", "-");
path = path.replace("_005f", "_");
path = path.replace("_002d", "-");

Collection<ResourceFinder> finders = new LinkedList<>();

Expand Down
2 changes: 1 addition & 1 deletion api/src/org/labkey/api/security/Encryption.java
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ public void addDynamicWarnings(@NotNull Warnings warnings, @Nullable ViewContext
if (context != null && context.getUser().hasSiteAdminPermission())
{
who = "you";
link = LinkBuilder.simpleLink("this link", Objects.requireNonNull(PageFlowUtil.urlProvider(AdminUrls.class)).getDeleteEncryptedContentURL());
link = LinkBuilder.simpleLink("this link", PageFlowUtil.urlProvider(AdminUrls.class).getDeleteEncryptedContentURL());
}
else
{
Expand Down
23 changes: 18 additions & 5 deletions api/src/org/labkey/api/util/PageFlowUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -3198,10 +3198,23 @@ public void testFormNameEncoding()
}
}

/** @return true if the UrlProvider exists. */
static public <P extends UrlProvider> boolean hasUrlProvider(Class<P> inter)
/**
* Returns a specified <code>UrlProvider</code> interface implementation, for use
* in writing URLs implemented in other modules.
*
* @param inter interface extending UrlProvider
* @return an implementation of the interface
* @throws IllegalArgumentException if the provider is not available. Use urlProviderOptional() if you're OK with it not being present
*/
@NotNull
static public <P extends UrlProvider> P urlProvider(Class<P> inter)
{
return UrlProviderService.getInstance().hasUrlProvider(inter);
P result = urlProviderOptional(inter);
if (result == null)
{
throw new IllegalArgumentException("No provider registered for " + inter.getName());
}
return result;
}

/**
Expand All @@ -3212,7 +3225,7 @@ static public <P extends UrlProvider> boolean hasUrlProvider(Class<P> inter)
* @return an implementation of the interface.
*/
@Nullable
static public <P extends UrlProvider> P urlProvider(Class<P> inter)
static public <P extends UrlProvider> P urlProviderOptional(Class<P> inter)
{
return UrlProviderService.getInstance().getUrlProvider(inter);
}
Expand All @@ -3228,7 +3241,7 @@ static public <P extends UrlProvider> P urlProvider(Class<P> inter)
* @param checkForOverrides true to check for module overrides to this interface
* @return an implementation of the interface.
*/
@Nullable
@NotNull
static public <P extends UrlProvider> P urlProvider(Class<P> inter, boolean checkForOverrides)
{
if (checkForOverrides)
Expand Down
4 changes: 2 additions & 2 deletions api/src/org/labkey/api/view/PopupMenu.java
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ else if (_buttonStyle == ButtonStyle.IMAGE || _buttonStyle == ButtonStyle.IMAGE_

UL(
cl("dropdown-menu dropdown-menu-left"),
(DOM.Renderable) ret2 -> PopupMenuView.renderTree(_navTree, out)
(DOM.Renderable) _ -> PopupMenuView.renderTree(_navTree, out)
).appendTo(out);

return ret;
Expand Down Expand Up @@ -245,7 +245,7 @@ public enum Align
LEFT("tl-bl?"),
RIGHT("tr-br?");

String extPosition;
final String extPosition;
Align(String position)
{
extPosition = position;
Expand Down
2 changes: 1 addition & 1 deletion api/src/org/labkey/api/view/Portal.java
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ public static void clearWebPartProperties(String nameSearchText, String properti

@NotNull static ProjectUrls urlProvider()
{
return Objects.requireNonNull(PageFlowUtil.urlProvider(ProjectUrls.class));
return PageFlowUtil.urlProvider(ProjectUrls.class);
}

/** Issue 51727 - metrics to track web part usage */
Expand Down
6 changes: 1 addition & 5 deletions core/src/org/labkey/core/admin/DisplayFormatAnalyzer.java
Original file line number Diff line number Diff line change
Expand Up @@ -215,10 +215,6 @@ public static UsageMetricsProvider getMetricsProvider()

private <P extends UrlProvider> @NotNull P urlProvider(Class<P> inter)
{
P provider = PageFlowUtil.urlProvider(inter);
if (provider == null)
throw new IllegalStateException("No urlProvider found for " + inter.getName());

return provider;
return PageFlowUtil.urlProvider(inter);
}
}
2 changes: 1 addition & 1 deletion core/src/org/labkey/core/admin/editMenuBar.jsp
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
<%@ taglib prefix="labkey" uri="http://www.labkey.org/taglib" %>
<%@ page extends="org.labkey.api.jsp.JspBase" %>
<%
HttpView me = HttpView.currentView();
HttpView<?> me = HttpView.currentView();
ActionURL refreshURL = urlProvider(AdminUrls.class).getProjectSettingsMenuURL(getContainer());
boolean isAdminMode = PageFlowUtil.isPageAdminMode(getViewContext());
String toggleUrl = urlProvider(ProjectUrls.class).getTogglePageAdminModeURL(getContainer(), getViewContext().getActionURL()).toString();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -176,13 +176,10 @@ public HtmlString getWarningsHtml(Warnings warnings, ViewContext context)
appendMessageContent(warnings, html);
html.unsafeAppend("</div>\n");
CoreUrls coreUrls = urlProvider(CoreUrls.class);
if (coreUrls != null)
{
String dismissURL = coreUrls.getDismissWarningsActionURL(context).toString();
html.unsafeAppend("<script type=\"text/javascript\" nonce=\"" + HttpView.currentPageConfig().getScriptNonce() + "\">\n");
html.unsafeAppend(String.format(DISMISSAL_SCRIPT_FORMAT, PageFlowUtil.jsString(dismissURL)));
html.unsafeAppend("</script>\n");
}
String dismissURL = coreUrls.getDismissWarningsActionURL(context).toString();
html.unsafeAppend("<script type=\"text/javascript\" nonce=\"" + HttpView.currentPageConfig().getScriptNonce() + "\">\n");
html.unsafeAppend(String.format(DISMISSAL_SCRIPT_FORMAT, PageFlowUtil.jsString(dismissURL)));
html.unsafeAppend("</script>\n");
html.unsafeAppend("</div>");

return html.getHtmlString();
Expand Down
8 changes: 2 additions & 6 deletions core/src/org/labkey/core/view/template/bootstrap/header.jsp
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@
LookAndFeelProperties laf = LookAndFeelProperties.getInstance(c);
ModuleLoader moduleLoader = ModuleLoader.getInstance();
boolean isStartupComplete = moduleLoader.isStartupComplete();
boolean showSearch = isStartupComplete && hasUrlProvider(SearchUrls.class);
boolean showSearch = isStartupComplete && PageFlowUtil.urlProviderOptional(SearchUrls.class) != null;

HtmlView headerHtml = new HeaderProperties(getContainer()).getView();
String siteShortName = (laf.getShortName() != null && !laf.getShortName().isEmpty()) ? laf.getShortName() : null;
Expand Down Expand Up @@ -182,9 +182,7 @@
<%
CoreUrls coreUrls = urlProvider(CoreUrls.class);

if (coreUrls != null)
{
String displayUrl = coreUrls.getDisplayWarningsActionURL(getViewContext()).toString();
String displayUrl = coreUrls.getDisplayWarningsActionURL(getViewContext()).toString();
%>
<script type="text/javascript" nonce="<%=getScriptNonce()%>">
+function($){
Expand All @@ -203,8 +201,6 @@
}(jQuery)
</script>
<%
}

if (showProductMenu)
{
%>
Expand Down
1 change: 0 additions & 1 deletion experiment/src/org/labkey/experiment/ProtocolSteps.jsp
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@
ppURL.addParameter("ParentLSID", protocol.getLSID());

ExperimentUrls urls = urlProvider(ExperimentUrls.class);
assert urls != null;

List<ExpProtocolActionImpl> steps = protocol.getSteps();
boolean debug = getViewContext().getRequest().getParameter("_debug") != null;
Expand Down
2 changes: 1 addition & 1 deletion experiment/src/org/labkey/experiment/RunGroupWebPart.java
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ protected void populateButtonBar(DataView view, ButtonBar bb)
super.populateButtonBar(view, bb);
if (!_narrow)
{
AssayUrls urls = PageFlowUtil.urlProvider(AssayUrls.class);
AssayUrls urls = PageFlowUtil.urlProviderOptional(AssayUrls.class);
if (null != urls)
{
ActionButton addXarFile = new ActionButton(urls.getImportAssayDesignURL(getViewContext().getContainer()), "Upload XAR");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -396,13 +396,8 @@ public ActionURL urlFor(Class<? extends Controller> actionClass, Container c)
return null;

ExperimentUrls urlProvider = PageFlowUtil.urlProvider(ExperimentUrls.class);
ActionURL url = null;

if (urlProvider != null)
{
url = urlProvider.getShowDataClassURL(container, getRowId());
url.setExtraPath(container.getId());
}
ActionURL url = urlProvider.getShowDataClassURL(container, getRowId());
url.setExtraPath(container.getId());

Map<String, Object> props = new HashMap<>();
Set<String> identifiersHi = new HashSet<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1000,13 +1000,8 @@ public String toString()
return null;

ExperimentUrls urlProvider = PageFlowUtil.urlProvider(ExperimentUrls.class);
ActionURL url = null;

if (urlProvider != null)
{
url = urlProvider.getShowSampleTypeURL(this);
url.setExtraPath(container.getId());
}
ActionURL url = urlProvider.getShowSampleTypeURL(this);
url.setExtraPath(container.getId());

Map<String, Object> props = new HashMap<>();
Set<String> identifiersHi = new HashSet<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1479,12 +1479,9 @@ else if (hardColumnNames.remove(propDescriptor.getStorageColumnName()))
if (!domainReport.getErrors().isEmpty())
{
ExperimentUrls urls = PageFlowUtil.urlProvider(ExperimentUrls.class);
if (null != urls)
{
ActionURL fix = urls.getRepairTypeURL(domain.getContainer());
fix.addParameter("domainUri", domain.getTypeURI());
domainReport.addError("See this page for more info: " + fix.getURIString());
}
ActionURL fix = urls.getRepairTypeURL(domain.getContainer());
fix.addParameter("domainUri", domain.getTypeURI());
domainReport.addError("See this page for more info: " + fix.getURIString());
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ private ActionButton getLinkToStudyButton(DataView view)
if (null == StudyPublishService.get() || StudyPublishService.get().getValidPublishTargets(getUser(), InsertPermission.class).isEmpty())
return null;

StudyUrls urls = PageFlowUtil.urlProvider(StudyUrls.class);
StudyUrls urls = PageFlowUtil.urlProviderOptional(StudyUrls.class);
if (urls == null)
return null;

Expand Down
2 changes: 1 addition & 1 deletion pipeline/src/org/labkey/pipeline/status/deleteStatus.jsp
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@

Container c = file.lookupContainer();
PipelineStatusUrls provider = urlProvider(PipelineStatusUrls.class);
ActionURL detailsURL = null != provider ? provider.urlDetails(c, file.getRowId()) : null;
ActionURL detailsURL = provider.urlDetails(c, file.getRowId());
sb.append("<span>job: <a href='").append(h(detailsURL)).append("'>").append(h(file.getDescription())).append("</a></span>");

// Directory that will be deleted if they aren't any usages
Expand Down
Loading
Loading