Skip to content
Open
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
26 changes: 26 additions & 0 deletions api/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -381,6 +381,32 @@ dependencies {
)
)

BuildUtils.addExternalDependency(
project,
new ExternalDependency(
"org.graphper:graph-support-core:${graphSupportVersion}",
"graph-support-core",
"graph-support",
"https://github.com/jamisonjiang/graph-support",
ExternalDependency.APACHE_2_LICENSE_NAME,
ExternalDependency.APACHE_2_LICENSE_URL,
"Graphviz Java API",
)
)

BuildUtils.addExternalDependency(
project,
new ExternalDependency(
"org.graphper:graph-support-dot:${graphSupportVersion}",
"graph-support-dot",
"graph-support",
"https://github.com/jamisonjiang/graph-support",
ExternalDependency.APACHE_2_LICENSE_NAME,
ExternalDependency.APACHE_2_LICENSE_URL,
"DOT parsing support",
)
)

BuildUtils.addExternalDependency(
project,
new ExternalDependency(
Expand Down
43 changes: 20 additions & 23 deletions api/src/org/labkey/api/module/ModuleDependencySorter.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,16 @@

import org.apache.commons.collections4.MultiValuedMap;
import org.apache.commons.collections4.multimap.ArrayListValuedHashMap;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.graphper.api.GraphResource;
import org.graphper.api.Graphviz;
import org.graphper.parser.DotParser;
import org.junit.Assert;
import org.junit.Test;
import org.labkey.api.collections.CaseInsensitiveHashSet;
import org.labkey.api.util.DotRunner;
import org.labkey.api.util.FileUtil;
import org.labkey.api.util.Pair;
import org.labkey.api.util.logging.LogHelper;

import java.io.File;
import java.util.ArrayList;
Expand All @@ -34,12 +36,12 @@
import java.util.stream.Collectors;

/**
* Orders modules so that each module will always be after all of the modules it depends on.
* User: jeckels
* Date: Jun 6, 2006
* Orders modules so that each module will always be after all the modules it depends on.
*/
public class ModuleDependencySorter
{
private static final Logger LOG = LogHelper.getLogger(ModuleDependencySorter.class, "Module dependency information");

public List<Module> sortModulesByDependencies(List<Module> modules)
{
List<Pair<Module, Set<String>>> dependencies = new ArrayList<>();
Expand Down Expand Up @@ -101,7 +103,7 @@ public List<Module> sortModulesByDependencies(List<Module> modules)
if (module.getName().equalsIgnoreCase("core"))
{
result.remove(i);
result.add(0, module);
result.addFirst(module);
break;
}
}
Expand All @@ -128,41 +130,36 @@ private Module findModuleWithoutDependencies(List<Pair<Module, Set<String>>> dep
throw new IllegalArgumentException("Module '" + moduleName + "' (" + entry.getKey().getClass().getName() + ") is listed as being dependent on itself.");
}

StringBuilder sb = new StringBuilder();
for (Pair<Module, Set<String>> dependencyInfo : dependencies)
{
if (!sb.isEmpty())
{
sb.append(", ");
}
sb.append(dependencyInfo.getKey().getName());
}
String involved = dependencies.stream()
.map(pair -> pair.getKey().getName())
.collect(Collectors.joining(", "));

// Generate an SVG diagram that shows all remaining dependencies
graphModuleDependencies(dependencies, "involved");

throw new IllegalArgumentException("Unable to resolve module dependencies. The following modules are somehow involved: " + sb);
throw new IllegalArgumentException("Unable to resolve module dependencies. The following modules are somehow involved: " + involved);
}


private void graphModuleDependencies(List<Pair<Module, Set<String>>> dependencies, @SuppressWarnings("SameParameterValue") String adjective)
{
Logger log = LogManager.getLogger(ModuleDependencySorter.class);

try
{
File dir = FileUtil.getTempDirectory();
String dot = buildDigraph(dependencies);
Graphviz graph = DotParser.parse(dot);
File svgFile = FileUtil.createTempFile("modules", ".svg", dir);
DotRunner runner = new DotRunner(dir, dot);
runner.addSvgOutput(svgFile);
runner.execute();

log.info("For a diagram of " + adjective + " module dependencies, see " + svgFile.getAbsolutePath());
try (GraphResource resource = graph.toSvg())
{
resource.save(svgFile.getParent(), svgFile.getName());
}

LOG.info("For a diagram of {} module dependencies, see {}", adjective, svgFile.getAbsolutePath());
}
catch (Exception e)
{
log.error("Error running dot", e);
LOG.error("Error running dot", e);
}
}

Expand Down
3 changes: 0 additions & 3 deletions core/src/org/labkey/core/CoreModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,6 @@
import org.labkey.api.notification.NotificationMenuView;
import org.labkey.api.portal.ProjectUrls;
import org.labkey.api.premium.AntiVirusProviderRegistry;
import org.labkey.api.products.Product;
import org.labkey.api.products.ProductRegistry;
import org.labkey.api.qc.DataStateManager;
import org.labkey.api.query.DefaultSchema;
Expand Down Expand Up @@ -267,7 +266,6 @@
import org.labkey.core.portal.CollaborationFolderType;
import org.labkey.core.portal.PortalJUnitTest;
import org.labkey.core.portal.ProjectController;
import org.labkey.core.portal.UtilController;
import org.labkey.core.products.ProductController;
import org.labkey.core.project.FolderNavigationForm;
import org.labkey.core.qc.CoreQCStateHandler;
Expand Down Expand Up @@ -443,7 +441,6 @@ protected void init()
addController("core", CoreController.class);
addController("analytics", AnalyticsController.class);
addController("project", ProjectController.class);
addController("util", UtilController.class);
addController("logger", LoggerController.class);
addController("mini-profiler", MiniProfilerController.class);
addController("notification", NotificationController.class);
Expand Down
107 changes: 0 additions & 107 deletions core/src/org/labkey/core/portal/UtilController.java

This file was deleted.

52 changes: 8 additions & 44 deletions core/src/org/labkey/core/security/SecurityController.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
import org.apache.commons.collections4.IteratorUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Sheet;
import org.graphper.api.Graphviz;
import org.graphper.parser.DotParser;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.json.JSONObject;
Expand Down Expand Up @@ -119,9 +121,6 @@
import org.labkey.api.security.roles.RoleManager;
import org.labkey.api.security.roles.SiteAdminRole;
import org.labkey.api.settings.AppProps;
import org.labkey.api.util.DotRunner;
import org.labkey.api.util.FileUtil;
import org.labkey.api.util.HelpTopic;
import org.labkey.api.util.HtmlString;
import org.labkey.api.util.HtmlStringBuilder;
import org.labkey.api.util.PageFlowUtil;
Expand Down Expand Up @@ -149,7 +148,6 @@
import org.springframework.validation.ObjectError;
import org.springframework.web.servlet.ModelAndView;

import java.io.File;
import java.io.IOException;
import java.io.Writer;
import java.sql.SQLException;
Expand Down Expand Up @@ -2099,50 +2097,16 @@ public ApiResponse execute(GroupDiagramForm form, BindException errors) throws E
}
else
{
String graph = GroupManager.getGroupGraphDot(groups, getUser(), form.getHideUnconnected());
File dir = FileUtil.getTempDirectory();
File svgFile = null;

try
{
svgFile = FileUtil.createTempFile("groups", ".svg", dir);
svgFile.deleteOnExit();
DotRunner runner = new DotRunner(dir, graph);
runner.addSvgOutput(svgFile);
runner.execute();
String svg = PageFlowUtil.getFileContentsAsString(svgFile);

int idx = svg.indexOf("<svg");
html = -1 != idx ? svg.substring(idx) : "Graphviz failed to generate this group diagram";
}
catch (IOException ioe)
{
if (ioe.getMessage().startsWith("Cannot run program \"dot\""))
{
html = "This feature requires graphviz to be installed; ";

if (getUser().hasRootPermission(AdminOperationsPermission.class))
html += "see " + new HelpTopic("thirdPartyCode").getSimpleLinkHtml("the LabKey installation instructions") + " for more information.";
else
html += "contact a server administrator about this problem.";
}
else
{
throw ioe;
}
}
finally
{
if (null != svgFile)
svgFile.delete();
}
String dot = GroupManager.getGroupGraphDot(groups, getUser(), form.getHideUnconnected());
Graphviz graph = DotParser.parse(dot);
html = graph.toSvgStr();
}

return new ApiSimpleResponse("html", html);
}
}

private static class GroupDiagramForm
public static class GroupDiagramForm
{
private boolean _hideUnconnected = false;

Expand All @@ -2159,7 +2123,7 @@ public boolean getHideUnconnected()
}

@RequiresPermission(AdminPermission.class)
public class FolderAccessAction extends SimpleViewAction<FolderAccessForm>
public static class FolderAccessAction extends SimpleViewAction<FolderAccessForm>
{
@Override
public ModelAndView getView(FolderAccessForm form, BindException errors)
Expand Down Expand Up @@ -2409,7 +2373,7 @@ controller.new GroupPermissionAction(),
new UpdatePermissionsAction(),
new ShowRegistrationEmailAction(),
new GroupDiagramAction(),
controller.new FolderAccessAction()
new FolderAccessAction()
);

// @RequiresPermission(UserManagementPermission.class)
Expand Down
Loading
Loading