RapidMiner studio之GUI源码分析
2015-07-14 15:20
567 查看
以GUI方式启动RapidMiner时,其入口是类com.rapidminer.gui.RapidMinerGUI,这个类中有com.rapidminer.RapidMiner类的一个引用,RapidMiner是整个工具的主类,其完成了大多数的初始化工作,RapidMinerGUI则添加了以GUI方式启动时的相关配置的初始化功能。
以下从com.rapidminer.gui.RapidMinerGUI的main方法开始,分析RapidMiner studio启动过程:
RapidMiner.main
SafeMode类的主要作用是在启动的时候判断是否有一个safeMode.lock文件,如果有,则说明上次启动后RapidMiner studio进程没有正常结束,则会询问用户是否要进入安全模式(安全模式下不加载插件),如果没有这个文件,则先创建这样一个文件,然后再启动进程,这个类的源码很简单,可以自己查看。
launch方法最终调用的是RapidMinerGUI中的run方法,run方法中,调用开源框架vldocking进行UI的设置,然后就是调用RapidMiner类中的静态方法和其它一些工具类进行参数的初始化工作,与UI相关的参数的初始化工作则在RapidMinerGUI类中完成。
以下分析run方法中调用的各个方法完成的工作:
代码的1-2行使用的是开源框架vldocking进行GUI的设置,因为先阶段关心的是RapidMiner的核心模块(operator,process,repository),所以暂时没有研究这个ui框架,等RapidMiner研究透彻了再来关心这个框架。
代码的3-4行是创建一个启动画面,在画面中提示当前进行的工作,这二行代码调用的方法的实现也很简单,这里就不做具体分析了,需要注意的是splashMessge方法是支持多语言环境的,其多语言支持请查看RapidMiner Studio之GUI多语言支持。
代码的第5行,是调用RapidMiner类的init方法完成一些功能的设置,这些功能包括多语言支持、rapidminer home变量设置、repository初始化、配置文件读取和访问、插件注册、operator注册、xml解析(解析operator的XML DOM)、加载JDBC驱动、渲染器初始化。
在调用RapidMiner的init方法之前,加载RapidMiner类时,RapidMiner中的static代码块首先完成一些参数的设置,这其中就包含了对语言的设置。
RapidMiner类的init调用的是其它工具类的方法来完成初始化工作,除了插件注册、operator注册外,其余方法都比较简单,下面分析下这插件注册和operator注册的代码:
插件注解调用的是Plugin.initAll方法:
operator注册调用的是OperatorService.init方法,该方法中主要有三部分组成
registerOperators最终调用的是parseOperators(GroupTree currentGroup, Element groupElement, ClassLoader classLoader, Plugin provider, OperatorDocBundle bundle)方法完成operator的注册,具体分析请查看RapidMiner studio之operator注册。
RapidMiner.init方法执行完成后,RapidMinerGUI.run方法会继续加载提示框工具、历史文件栏、图标,最后是创建main frame,这个frame即最后打开的工作界面,创建frame是通过以下代码实现的:
MainFrame类是RapidMiner GUI的最主要的组成类,该类中定义了对menu bar和tool bar作出响应的actions,并且负责处理process事件(新建、打开、保存等),会时刻监控process的变化并将变化传递出去,该类主要是围绕action展开的,具体请查看RapidMiner studio之MainFrame源码分析。
以下从com.rapidminer.gui.RapidMinerGUI的main方法开始,分析RapidMiner studio启动过程:
RapidMiner.main
safeMode = new SafeMode(); safeMode.launchStarts(); launch(args); safeMode.launchComplete();
SafeMode类的主要作用是在启动的时候判断是否有一个safeMode.lock文件,如果有,则说明上次启动后RapidMiner studio进程没有正常结束,则会询问用户是否要进入安全模式(安全模式下不加载插件),如果没有这个文件,则先创建这样一个文件,然后再启动进程,这个类的源码很简单,可以自己查看。
launch方法最终调用的是RapidMinerGUI中的run方法,run方法中,调用开源框架vldocking进行UI的设置,然后就是调用RapidMiner类中的静态方法和其它一些工具类进行参数的初始化工作,与UI相关的参数的初始化工作则在RapidMinerGUI类中完成。
以下分析run方法中调用的各个方法完成的工作:
DockingUISettings.setInstance(new DockingUISettings()); DockableContainerFactory.setFactory(new TabFactory()); RapidMiner.showSplash(); RapidMiner.splashMessage("basic"); RapidMiner.init(); RapidMiner.splashMessage("workspace"); RapidMiner.splashMessage("plaf"); setupToolTipManager(); setupGUI(); RapidMiner.splashMessage("history"); loadRecentFileList(); RapidMiner.splashMessage("icons"); SwingTools.loadIcons(); RepositoryManager.getInstance(null).createRepositoryIfNoneIsDefined(); RapidMiner.splashMessage("create_frame"); SwingUtilities.invokeAndWait(new Runnable() { @Override public void run() { setMainFrame(new MainFrame(openLocation != null ? "design" : "welcome")); } }); RapidMiner.splashMessage("gui_properties"); loadGUIProperties(mainFrame); RapidMiner.splashMessage("plugin_gui"); Plugin.initPluginGuis(mainFrame); RapidMiner.splashMessage("show_frame"); mainFrame.setVisible(true); UsageStatsTransmissionDialog.init(); RapidMiner.splashMessage("checks"); Plugin.initFinalChecks(); RapidMiner.splashMessage("ready"); RapidMiner.hideSplash(); if (openLocation != null) { if(!RepositoryLocation.isAbsolute(openLocation)) { SwingTools.showVerySimpleErrorMessage("malformed_repository_location", openLocation); } else { OpenAction.open(openLocation, false); } } Plugin.initPluginUpdateManager(); UpdateManager.checkForUpdates(); UpdateManager.checkForPurchasedNotInstalled(); AutoSave autosave = new AutoSave(); autosave.onLaunch();
代码的1-2行使用的是开源框架vldocking进行GUI的设置,因为先阶段关心的是RapidMiner的核心模块(operator,process,repository),所以暂时没有研究这个ui框架,等RapidMiner研究透彻了再来关心这个框架。
代码的3-4行是创建一个启动画面,在画面中提示当前进行的工作,这二行代码调用的方法的实现也很简单,这里就不做具体分析了,需要注意的是splashMessge方法是支持多语言环境的,其多语言支持请查看RapidMiner Studio之GUI多语言支持。
代码的第5行,是调用RapidMiner类的init方法完成一些功能的设置,这些功能包括多语言支持、rapidminer home变量设置、repository初始化、配置文件读取和访问、插件注册、operator注册、xml解析(解析operator的XML DOM)、加载JDBC驱动、渲染器初始化。
在调用RapidMiner的init方法之前,加载RapidMiner类时,RapidMiner中的static代码块首先完成一些参数的设置,这其中就包含了对语言的设置。
RapidMiner类的init调用的是其它工具类的方法来完成初始化工作,除了插件注册、operator注册外,其余方法都比较简单,下面分析下这插件注册和operator注册的代码:
插件注解调用的是Plugin.initAll方法:
public static void initAll() { // only load managed extensions if execution modes indicates if (RapidMiner.getExecutionMode().isLoadingManagedExtensions()) ManagedExtension.init(); String loadPluginsString = ParameterService.getParameterValue(RapidMiner.PROPERTY_RAPIDMINER_INIT_PLUGINS); boolean loadPlugins = Tools.booleanValue(loadPluginsString, true); SafeMode safeMode = RapidMinerGUI.getSafeMode(); boolean isSafeMode = false; if (safeMode != null) { isSafeMode = safeMode.isSafeMode(); } //允许加载插件且不是处于安全模式 if (loadPlugins && !isSafeMode) { File webstartPluginDir; if (RapidMiner.getExecutionMode() == ExecutionMode.WEBSTART) { webstartPluginDir = updateWebstartPluginsCache(); } else { webstartPluginDir = null; } //取插件路径,如果没有配置插件路径参数,则默认是rapidminer home目录下的lib/plugins目录 File pluginDir = null; String pluginDirString = ParameterService.getParameterValue(RapidMiner.PROPERTY_RAPIDMINER_INIT_PLUGINS_LOCATION); if (pluginDirString != null && !pluginDirString.isEmpty()) { pluginDir = new File(pluginDirString); } if (pluginDir == null) { try { pluginDir = getPluginLocation(); } catch (IOException e) { LogService.getRoot().log( Level.WARNING, "com.rapidminer.tools.plugin.Plugin.no_properties_set", new Object[] { RapidMiner.PROPERTY_RAPIDMINER_INIT_PLUGINS, Launcher.PROPERTY_RAPIDMINER_HOME }); } } if (webstartPluginDir != null) { findAndRegisterPlugins(webstartPluginDir, true); } if (pluginDir != null) { //加载插件目录下的所有插件,第二个参数的作用是当发现jar包不是插件时,打印警告日志 //该方法会调用registerPlugins(List<File> files, boolean showWarningForNonPluginJars)方法来完成插件的初始化功能 //registerPlugins方法中,读取jar包中MAINFEST.MF文件的内容,并将值封装到Plugin对象中 //另外,如果一个插件(根据Extension-ID判断)对应多个版本,则取这个插件的最新版本 findAndRegisterPlugins(pluginDir, true);
} registerPlugins(ManagedExtension.getActivePluginJars(), true); //加载插件的Descriptions,首先是会判断插件版本和插件的依赖是否满足条件 //对于合法的插件,会调用Plugin对象的registerDescriptions方法,该方法完成的工作是加载jar的xml配置文件 registerAllPluginDescriptions(); //检查依赖并添加依赖的classloader到插件的classloader中 finalizePluginLoading(); //通过反射调用pluginInitClassName属性指定的类的initPlugin方法,如果执行成功,则该插件注册成功 initPlugins(); } else { LogService.getRoot().log(Level.INFO, "com.rapidminer.tools.plugin.Plugin.plugins_skipped"); } }
operator注册调用的是OperatorService.init方法,该方法中主要有三部分组成
//注册com.repidminer.resources.OperatorsCore.xml配置的operator registerOperators(mainOperators, null, null); //注册通过参数指定的外部operator String additionalOperators = System.getProperty(RapidMiner.PROPERTY_RAPIDMINER_OPERATORS_ADDITIONAL); //插件中的operator Plugin.registerAllPluginOperators();
registerOperators最终调用的是parseOperators(GroupTree currentGroup, Element groupElement, ClassLoader classLoader, Plugin provider, OperatorDocBundle bundle)方法完成operator的注册,具体分析请查看RapidMiner studio之operator注册。
RapidMiner.init方法执行完成后,RapidMinerGUI.run方法会继续加载提示框工具、历史文件栏、图标,最后是创建main frame,这个frame即最后打开的工作界面,创建frame是通过以下代码实现的:
SwingUtilities.invokeAndWait(new Runnable() { @Override public void run() { setMainFrame(new MainFrame(openLocation != null ? "design" : "welcome")); } });
MainFrame类是RapidMiner GUI的最主要的组成类,该类中定义了对menu bar和tool bar作出响应的actions,并且负责处理process事件(新建、打开、保存等),会时刻监控process的变化并将变化传递出去,该类主要是围绕action展开的,具体请查看RapidMiner studio之MainFrame源码分析。
相关文章推荐
- uitableview cell实现性能优化
- [Thu, 9 Jul 2015 ~ Tue, 14 Jul 2015] Deep Learning in arxiv
- Android浏览器(一):Webkit项目与Chromuim项目
- NSMutableURLRequest和NSURLConnection用Post方式上传照片
- uilabel实现自动换行
- POJ 1458 Common Subsequence-dp-(最长公共子序列模型)
- OSGI Blueprint(6)
- StringBuilder与StringBuffer的区别(转)
- ui开头的控件和ns开头的控件有什么区别iOS
- 快速排序 Quick Sort
- UI1_UITableViewHomeWork
- 1007. Maximum Subsequence Sum (25)
- Selenium学习笔记之003:Web UI自动化知识点整理
- [@Controller]3 详解@CookieValue,@PathVariable,@RequestBody,@RequestHeader,@RequestParam
- radio 通过数据库中的value值 自动获取选中状态
- AlertDialog.Builder弹出自定义Layout窗口
- MUI - 引导页制作
- Failed to deploy project. For more information, query the operation_messages view
- Splay树 + 离散化 —— HDU 3436 Queue-jumpers
- Android UI-SlidingMenu侧滑菜单效果