在过去的几周里,除了做一些实际的开发工作外,我还开发了一个简单的工具来显示微容器的组件。我将这个项目命名为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 ;-)