[SDU软件工程实践]Blog4-processLine及processCmd

2021SC@SDUSC

方法processLine

官方注释

官方其实在源代码里为这个方法写了javadoc注释,我们来看看
果然是英文呢……
首先第一句明确了一件事:这个方法会用来处理一个用分号分割的命令的。这和我上一篇的推测是基本一致的。
line不用解释了
第二个参数allowInterrupting如果为true,那么会允许通过系统的进程中断信号打断该方法的执行,此时该方法会返回-1。正常情况下会返回0
稍微知道了一些信息,最重要的是确定这个方法的用途了。
之后底下有一块处理系统信号的代码,跳过。

字符串处理

这一段核心是字符串处理
这里重点是进行了字符串处理。
指令中有可能通过//;进行转义,我们需要处理这个。这也是这里第一行的注释:
“我们不能直接通过spilt获得命令,因为;可能被转义”
的意思。
不过第一步仍然是使用split以分号分割。然后在循环中,如果发现某一段以//为结尾,那么它显然是转义了;的。把这段直接加到command变量中,并且执行下一次循环(以跳过后面的执行)
然后其他情况下就应该是正确的分割结果了,这个被读取的字符串一定是某一条指令的结尾。我们把它加到command变量中就可以准备执行命令了。
它还补了一个对command是否为空白的检查,好评。
最后呢是引向了processCmd,这回是将分割过的一条独立的命令传下去了。

方法processCmd

开头的一部分是和线程啥相关的,我们先跳过。
可以发现的是,这里还是有一些预处理。因为即使是细分这么多之后,我们输入的命令仍然有一些特例要处理。

预处理

trim
这里还是字符串处理,cmd_trimmed是剥离注释后去除前后空格得到的,还是进行了精简(这个是通过removeComments方法的javadoc注释得到的,写注释是好习惯)
而这个tokens,由这个tokenizeCmd得到,这个方法长这个样子
这是个正则表达式
这个正则表达式是匹配任何空白符,看来是将一句指令打散为token的方法,tokens这个数组已经是token化的指令了,我们继续。
这里是处理
这里是处理quitexit。就是退出嘛。
注意这个source

下面一个if分支是处理开头为source的命令的。source的用途是执行指定的hql文件。那么其实接下来一段的代码的目的已经知道了。
这个getFirstCmd就是一个substring,返回指定数字后的字符,也就是source之后的且去掉首尾空格的所有字符了,也就是文件名。那后面都很好说了,访问文件等等。检验了文件的存在后就交给processFile方法了,这个已经看过了,继续。
为啥呢……
!代表我们要执行Linux命令……过吧

确定最终执行的是hql后

最后一段
看来这就是排除了特殊情况后的分支了,能走到这里的命令应该是hql命令。
这里其实很明确的是最后是递交给了下一个叫processLocalCmd的方法。这里面涉及CommandProcessorFactory.get很重要,我们下周继续。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值