2021SC@SDUSC
方法processLine
官方注释
官方其实在源代码里为这个方法写了javadoc注释,我们来看看
首先第一句明确了一件事:这个方法会用来处理一个用分号分割的命令的。这和我上一篇的推测是基本一致的。
line
不用解释了
第二个参数allowInterrupting
如果为true
,那么会允许通过系统的进程中断信号打断该方法的执行,此时该方法会返回-1
。正常情况下会返回0
稍微知道了一些信息,最重要的是确定这个方法的用途了。
之后底下有一块处理系统信号的代码,跳过。
字符串处理
这里重点是进行了字符串处理。
指令中有可能通过//
将;
进行转义,我们需要处理这个。这也是这里第一行的注释:
“我们不能直接通过spilt
获得命令,因为;
可能被转义”
的意思。
不过第一步仍然是使用split
以分号分割。然后在循环中,如果发现某一段以//
为结尾,那么它显然是转义了;
的。把这段直接加到command
变量中,并且执行下一次循环(以跳过后面的执行)
然后其他情况下就应该是正确的分割结果了,这个被读取的字符串一定是某一条指令的结尾。我们把它加到command
变量中就可以准备执行命令了。
它还补了一个对command
是否为空白的检查,好评。
最后呢是引向了processCmd
,这回是将分割过的一条独立的命令传下去了。
方法processCmd
开头的一部分是和线程啥相关的,我们先跳过。
可以发现的是,这里还是有一些预处理。因为即使是细分这么多之后,我们输入的命令仍然有一些特例要处理。
预处理
这里还是字符串处理,cmd_trimmed
是剥离注释后去除前后空格得到的,还是进行了精简(这个是通过removeComments
方法的javadoc注释得到的,写注释是好习惯)
而这个tokens
,由这个tokenizeCmd
得到,这个方法长这个样子
这个正则表达式是匹配任何空白符,看来是将一句指令打散为token的方法,tokens
这个数组已经是token化的指令了,我们继续。
这里是处理quit
,exit
。就是退出嘛。
下面一个if
分支是处理开头为source
的命令的。source
的用途是执行指定的hql文件。那么其实接下来一段的代码的目的已经知道了。
这个getFirstCmd
就是一个substring
,返回指定数字后的字符,也就是source
之后的且去掉首尾空格的所有字符了,也就是文件名。那后面都很好说了,访问文件等等。检验了文件的存在后就交给processFile
方法了,这个已经看过了,继续。
!
代表我们要执行Linux命令……过吧
确定最终执行的是hql后
看来这就是排除了特殊情况后的分支了,能走到这里的命令应该是hql命令。
这里其实很明确的是最后是递交给了下一个叫processLocalCmd
的方法。这里面涉及CommandProcessorFactory.get
很重要,我们下周继续。