微容器工具 - 图形化工具

发布者:    |      

在过去的几周里,除了做一些实际的开发工作外,我还开发了一个简单的工具来显示微容器的组件。我将这个项目命名为Grapher,因为这个项目/应用程序的作用就是创建一个简单的图形。

这是当前JBoss5.1.0.GA微容器组件的简单图形。正如我们已经在DZone和MC组件模型中了解到的那样,组件类型(目前)包括POJOs、MBeans、别名、部署、核心服务和任何扩展(KernelRegistryPlugin)。你可以看到有很多组件,而且很难将它们全部放在一个简单的图形中。

[AllGraphCreator] Vertices: 830, Edges: 1563

我使用JGraph来进行渲染,同时仅使用其布局组件进行个人使用(许可证要求)。

项目的源代码位于此处,任何UI或核心贡献都始终欢迎。特别是UI部分可以做些工作,因为我在这方面相当糟糕——目前所有输入/输出都是通过单个servlet和浏览器的地址栏完成的。:-)

代码本身结构良好,分为功能模块

  • 图形创建
  • 布局
  • 请求映射
  • 渲染
  • 路由
  • 分析(待办事项)

图形创建的实例如下

  • 全部 - 显示所有组件
  • Bean - 显示组件及其第一级依赖项
  • 树 - 显示组件及其所有传递依赖项
  • 部署 - 显示部署的组件;递归/传递性是可选的

一些示例

  • http://localhost:8080/grapher/
  • http://localhost:8080/grapher/?bean=MainDeployer
  • http://localhost:8080/grapher/?tree=MainDeployer
  • http://localhost:8080/grapher/?deployment=vfs-jboss-beans.xml
  • http://localhost:8080/grapher/?deployment=vfs-jboss-beans.xml&recurse=true
  • http://localhost:8080/grapher/?deployment=metadata-deployer-jboss-beans.xml&folder=deployers

由于许可证问题,布局是通过反射进行修改的,但个人使用时可以使用以下任一JGraphLayout实现

      // a ctor hack
      map.put("simple0", "com.jgraph.layout.graph.JGraphSimpleLayout");
      map.put("simple1", "com.jgraph.layout.graph.JGraphSimpleLayout");
      map.put("simple2", "com.jgraph.layout.graph.JGraphSimpleLayout");

      map.put("tree", "com.jgraph.layout.tree.JGraphTreeLayout");
      map.put("spring", "com.jgraph.layout.graph.JGraphSpringLayout");
      map.put("hierarchical", "com.jgraph.layout.hierarchical.JGrapHierarchicalhLayout");
      map.put("compound", "com.jgraph.layout.JGraphCompoundLayout");
      map.put("compact", "com.jgraph.layout.tree.JGraphCompactTreeLayout");
      map.put("moen", "com.jgraph.layout.tree.JGraphMoenLayout");
      map.put("radial", "com.jgraph.layout.graph.JGraphRadialTreeLayout");
      map.put("annealing", "com.jgraph.layout.graph.JGraphAnnealingLayout");
      map.put("fr", "com.jgraph.layout.graph.JGraphFRLayout");
      map.put("organic", "com.jgraph.layout.organic.JGraphOrganicLayout");
      map.put("self", "com.jgraph.layout.organic.JGraphSelfOrganizingOrganicLayout");
      map.put("isom", "com.jgraph.layout.graph.JGraphISOMLayout");
      map.put("org", "com.jgraph.layout.tree.OrganizationalChart");
      map.put("grid", "com.jgraph.layout.simpl.SimpleGridLayout");

其中默认使用的是SimpleGridLayout。

  • http://localhost:8080/grapher/?tree=MainDeployer&layout=isom

注意:我还需要检查如何更好地处理布局,因为我看到太多重叠。

每个组件都可以在配置或运行时进行更改。

public interface GraphComponentMapper<T>
{
   /**
    * Initialize.
    *
    * @param config the config map
    */
   void init(Map<String, String> config);

   /**
    * Map component from request.
    *
    * @param request the request
    * @return mapped component
    */
   T mapComponent(HttpServletRequest request);

   /**
    * Map component to the key.
    *
    * @param key the key
    * @param value the value
    * @return mapped component
    */
   T mapComponent(String key, String value);
}

我在图创建器、布局和渲染器中都有这样的组件映射器。默认值在servlet初始化时使用,但您可以提供自己的。

目前我支持以下渲染器

  • PNG(默认)
  • JPG
  • GIF
  • SVG
  • Html ul/li

渲染器示例

  • http://localhost:8080/grapher/?tree=MainDeployer&renderer=svg

任何请求都可以使用这些的组合,以及一些额外的过滤。

您可以列出要排除的组件类型

      mapControllerContextClass("pojo", AbstractKernelControllerContext.class, Color.BLUE);
      mapControllerContextClass("alias", AliasControllerContext.class, Color.GRAY);
      mapControllerContextClass("core", BeanKernelRegistryEntry.class, Color.RED);
      mapControllerContextClass("ext", AbstractKernelRegistryEntry.class, Color.ORANGE);
      mapControllerContextClass("mbean", "org.jboss.system.microcontainer.ServiceControllerContext", Color.MAGENTA);
      mapControllerContextClass("dep", "org.jboss.deployers.plugins.deployers.DeploymentControllerContext", Color.GREEN);

在这里,您还可以看到映射到特定组件类型的颜色。

排除POJO示例

  • http://localhost:8080/grapher/?exclude=pojo

排除多个类型

  • http://localhost:8080/grapher/?exclude=mbean,ext,alias

还有可用的选项是定义您想要用来查找依赖关系的依赖类型

  • IDepenOn(默认)
  • DependsOnMe
  • Unresolved

  • http://localhost:8080/grapher/?tree=MainDeployer&dependency=DependsOnMe

这使我们剩下分析部分,这部分仍然是WIP。整个图由JBoss Common Core Graph代码支持,因此我们已经有了一些理论算法,但我还想做更多。

我的当前想法是以某种方式将规则/脚本与图论结合起来。

  • 给我所有顶点数小于20的子图
  • 给我所有深度小于5的子图

这样我们就可以做一些适当的分析,并轻松地确定如何放置按需模式并定义懒加载的bean。但就像我说的,这仍然非常不确定,所以任何帮助都受欢迎。 wink wink我们的Drools committers. ;-)

项目的另一个好处是,大多数代码都经过了适当的测试,每个功能部分都有相应的测试。所以,当你贡献时,你知道你什么时候打破了东西。;-)

ps: 简单的 mvn package 创建 grapher.war,对于任何有用的布局检查 pom.xml ;-)


返回顶部