diff --git a/core/src/org/labkey/core/query/ModulesTableInfo.java b/core/src/org/labkey/core/query/ModulesTableInfo.java index c5ca00905b8..135c53a060a 100644 --- a/core/src/org/labkey/core/query/ModulesTableInfo.java +++ b/core/src/org/labkey/core/query/ModulesTableInfo.java @@ -19,10 +19,13 @@ import org.jetbrains.annotations.NotNull; import org.labkey.api.data.BaseColumnInfo; import org.labkey.api.data.ColumnInfo; +import org.labkey.api.data.Container; +import org.labkey.api.data.ContainerManager; import org.labkey.api.data.CoreSchema; import org.labkey.api.data.DisplayColumn; import org.labkey.api.data.DisplayColumnDecorator; import org.labkey.api.data.DisplayColumnFactory; +import org.labkey.api.data.ExpandableTextDisplayColumnFactory; import org.labkey.api.data.JdbcType; import org.labkey.api.data.RenderContext; import org.labkey.api.data.SQLFragment; @@ -36,7 +39,11 @@ import org.labkey.api.util.StringExpressionFactory; import org.labkey.api.writer.HtmlWriter; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * User: kevink @@ -94,6 +101,7 @@ public void addColumns() var licenseCol = addTextColumn("License"); licenseCol.setURL(StringExpressionFactory.createURL("${LicenseURL}")); licenseCol.setURLTargetWindow("_blank"); + addTextColumn("ActiveFolders").setDisplayColumnFactory(new ExpandableTextDisplayColumnFactory()); addTextColumn("LicenseURL").setHidden(true); addTextColumn("VcsRevision"); addTextColumn("VcsURL"); @@ -109,7 +117,8 @@ public void addColumns() FieldKey.fromParts("SchemaVersion"), FieldKey.fromParts("Label"), FieldKey.fromParts("Organization"), - FieldKey.fromParts("License") + FieldKey.fromParts("License"), + FieldKey.fromParts("ActiveFolders") )); } @@ -182,6 +191,8 @@ public SQLFragment getFromSQL(String alias) cte.append("SELECT * FROM (\n"); cte.append("VALUES "); String sep = ""; + + Map> moduleContainers = getContainersForModule(); for (Module module : ModuleLoader.getInstance().getModules()) { cte.append(sep); @@ -203,6 +214,7 @@ public SQLFragment getFromSQL(String alias) appendStringLiteral(h, cte,",",module.getSourcePath()); appendStringLiteral(h, cte,",",StringUtils.join(module.getModuleDependenciesAsSet(), ", ")); appendStringLiteral(h, cte,",",module.getSupportedDatabasesSet().toString()); + appendStringLiteral(h, cte,",", StringUtils.join(moduleContainers.getOrDefault(module, Collections.emptyList()), "\n")); cte.append(")"); } cte.append(") AS T ("); @@ -219,6 +231,7 @@ public SQLFragment getFromSQL(String alias) cte.append(",VcsRevision, VcsURL"); cte.append(",SourcePath"); cte.append(",Dependencies, SupportedDatabases"); + cte.append(",ActiveFolders"); cte.append(")\n"); String tableName = getSqlDialect().truncate(alias + "$m", 0); @@ -239,6 +252,22 @@ public SQLFragment getFromSQL(String alias) return ret; } + private Map> getContainersForModule() + { + Map> moduleFolders = new HashMap<>(); + + for (Container container : ContainerManager.getAllChildren(ContainerManager.getRoot())) + { + if (container != null) + container.getActiveModules().forEach(m -> moduleFolders.computeIfAbsent(m, k -> new ArrayList<>()).add(container.getPath())); + } + + for (List folders : moduleFolders.values()) + Collections.sort(folders); + + return moduleFolders; + } + // Format SchemaVersion column using the standard ModuleContext formatting rules: force three-decimal places for >= 20.000, // otherwise suppress trailing zeroes. Also, right align the values in the grid. private static class SchemaVersionDisplayColumnFactory implements DisplayColumnFactory