openmeetings-install分析(七)——Admin类解析命令行分析

2021SC@SDUSC


先回顾一下openmeetings-install包下存放主要代码的文件结构
openmeetings-install包下存放主要代码的文件结构
在之前的文章中,我们已经分析完了installation包,下面我们开始进行cli包下代码的分析


Apache有一款解析命令行的工具包:Apache Commons CLI ,和这个文件夹的命名是一样的,那么它的作用可能也有相似之处?我决定通过对Apache Commons CLI进行学习来一步步分析该包的代码。

官方教程地址:https://commons.apache.org/proper/commons-cli/introduction.html

命令行处理有三个阶段。它们是定义、分析和询问阶段。下面将依次讨论这些阶段,并讨论如何使用CLI实现它们。

定义阶段

每个命令行必须定义一组选项,这些选项将用于定义应用程序的接口。CLI使用Options类作为Option实例的容器。在CLI中创建Options有两种方法。一种是通过构造函数,另一种是通过Options中定义的工厂方法。定义阶段的结果是一个Options实例。

在Admin类中,通过buildOptions方法创建Options类,并添加相应实例

// Admin.java
	private Options buildOptions() {
	    // 通过构造函数创建Options
		Options options = new Options();
		// OptionGroup: 包含了一组相互排斥的选项
		// addOption()方法用于添加特定的Option类到组里面
		// OmOption类继承自Option类,其中几个参数分别表示组、顺序、选项简写、选项完整写法、有无参数、选项描述
		OptionGroup group = new OptionGroup()
			.addOption(new OmOption("h", 0, "h", "help", false, "prints this message"))
			.addOption(new OmOption("b", 1, "b", "backup", false, "Backups OM"))
			.addOption(new OmOption("r", 2, "r", "restore", false, "Restores OM"))
			.addOption(new OmOption("i", 3, "i", "install", false, "Fill DB table, and make OM usable"))
			.addOption(new OmOption("l", 3, "l", "LDAP", false, "Import LDAP users into DB"))
			.addOption(new OmOption("f", 4, "f", "files", false, "File operations - statictics/cleanup"));
		// 设置是否需要此组
		group.setRequired(true);
		options.addOptionGroup(group);
		...
	    return options;
	}

解析阶段

解析阶段是处理通过命令行传递到应用程序的文本的阶段。根据解析器实现定义的规则对文本进行处理。在CommandLineParser上定义的解析方法接受一个Options实例和一个String[]参数,并返回一个CommandLine。解析阶段的结果是一个CommandLine实例。

在Admin类中,通过process方法对命令行进行解析

    // Admin.java
	void process(String... args) throws Exception {
	    // create the parser
		CommandLineParser parser = new DefaultParser();
		try {
		    // parse the command line arguments
			cmdl = parser.parse(opts, args);
		} catch (ParseException e) {
			log(e.getMessage());
			usage();
			throw new ExitException();
		}
		...
	}

询问阶段

在询问阶段,应用程序根据布尔选项查询CommandLine,以决定采用哪个执行分支,并使用选项值提供应用程序数据。这个阶段是在用户代码中实现的。CommandLine上的访问器方法为用户代码提供查询功能。查询阶段的结果是,用户代码完全了解命令行上提供的所有文本,并根据解析器和Options规则进行处理。

    // Admin.java
	void process(String... args) throws Exception {
		...
		verbose = cmdl.hasOption('v');

		Command cmd = Command.usage;
		if (cmdl.hasOption('i')) {
			cmd = Command.install;
		} else if (cmdl.hasOption('b')) {
			cmd = Command.backup;
		} else if (cmdl.hasOption('r')) {
			cmd = Command.restore;
		} else if (cmdl.hasOption('f')) {
			cmd = Command.files;
		} else if (cmdl.hasOption('l')) {
			cmd = Command.ldap;
		}

		String file = cmdl.getOptionValue("file", "");
		switch(cmd) {
			case install:
				step = "Install";
				processInstall(file);
				break;
			case backup:
				step = "Backup";
				processBackup(file);
				break;
			case restore:
				step = "Restore";
				processRestore(checkRestoreFile(file));
				break;
			case files:
				step = "Files";
				processFiles();
				break;
			case ldap:
				step = "LDAP import";
				processLdap();
				break;
			case usage:
			default:
				usage();
				break;
		}
	}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值