2009年8月13日星期四

CMSEntity之九,提交item的逻辑

接昨日:
获取内容描述文件并对其进行初步分析后,ContentProcessorJob会调用ContentHandler类的方法做进一步处理。方法invokeProcess是入口,invokeProcess首先就调用getSuitableBatch去获得合适的batch,所谓合适的 batch,就是在上篇博客中提到的,处理完所有的item后,要将其状态更新,置为saved,以便于后面的操作。所以 getSuitableBatch就是将这些状态为saved的项取出来。

getSuitableBatch得到的是 List,之后invokeProcess调用commonStorageHandling来“handle the common storage”(不太明白这里的意思),昨天提到,可以通过batchId来得到content的信息,commonStorageHandling调用getContentByBatchID返回List。commonStorageHandling后面的处理让我有些摸不着头脑,它先是检查每个ContentItemVO的ProcStatCodeID,如果是CONTENT_STATUS_SAVED或者CONTENT_STATUS_TIMEDOUT,再去获得ISMPItemVO,也去挨个检查ProcStatCodeID,如果是 ITEM_FETCH_SUCCESS或者ITEM_STATUS_TIMEDOUT,然后到本地目录去获取内容实体zip文件,如果文件不存在,将 ISMPItemVO的ProcStatCodeID改为ITEM_STATUS_PARSED。这一段操作的目的还不清楚。 commonStorageHandling的返回值是boolean型,表示内容实体zip文件在本地目录是否存在。

commonStorageHandling返回到invokeProcess,invokeProcess根据返回值,如果为真,它调用方法processBatchNotify。

processBatchNotify也是首先用getContentByBatchID获得List。然后对每个ContentItemVO调用方法processContent,这个方法非常重要:“Iterate the item list of this content, prepare the MetaFile and generate the zip, Invoke the BMC web service to Submit the item. Use the return brew_item_id to update ContentItemVO object. update the ItemVO's zip file directory and metafile XML file and final zip file result.”。也就是说,这个方法生成了Meta文件,并将Meta文件和内容实体zip文件一起再生成一个zip文件,并将这个zip文件传给 BMC。

processContent是根据OPFLAG进行操作的,有三种OPFLAG:OPFLAG_ADD,OPFLAG_MODIFY和OPFLAG_DELETE。

先看OPFLAG_ADD的情况:
1. 查询数据库,用方法checkContentItemExists,这个方法的功能是“This is to check content is exist with current content id and partNo in BSG”。也就是查找在当前数据库中是否已经存在该内容。注意这里使用的参数是content ID,manufacturer partner no和content no,前面两个很好理解,最后一个content number不知道是什么。根据这三个来判断该内容在当前库中是否存在。如果存在,进入2.x,否则进入3.x。

2.1 调用方法checkItemExistsForTheContent,这个方法的功能是:“This is to check content is exist with current content id and partNo in BSG”。这个解释让人迷惑,为什么又去判断content是否存在?所以我判断这里的注释肯定不对,印度兄弟偷懒了,把 checkContentItemExists的注释又拷贝到这里。按checkItemExistsForTheContent这个方法名来判断,不好说这个方法是什么功能,它的返回值如为true,进入2.2,否则进入2.3。
2.2 用方法getItemVOList去获得List,然后对每个ISMPItemVO调用checkISMPItemExists,这个方法的功能是“This is to verify that Item is already exist or not”。返回true表示content里已经存在该item了,进入 2.2.a,否则进入2.2.b。
2.2.a 调用方法applyPlatformLanguage,这个方法首先调用ChangeListCreator.getUseableChangeList,现在不知道change list是干啥用的,它返回ChangeListVO,如果不为空,则调用 ItemSubmissionHandler.addOprItemPlatform方法,这个方法很长,这里先不细谈,它的功能是把该item的平台信息(支持的手机类型)保存。
2.2.b 调用方法processAsUpgradeItem,将该item作为新的item上传给BMC。这是通过ItemSubmissionHandler.processItem方法实现的。
2.3 用方法getItemVOList去获得List,对每个ISMPItemVO,调用ItemSubmissionHandler.processItem方法将其作为新的item提交到BMC。

3.1 当前的content不存在,首先调用checkContentExists,这个方法的功能是“This method checks whether content exists or not”。这里让人很迷惑,前面不是已经用checkContentItemExists检查过content是否存在了吗,为什么又检查一次?如果返回true,就调用markedForDelete,这个方法“This method is used for delete handling when only contentId exists”。
3.2 用getItemVOList得到List,对每个ISMPItemVO,调用checkItemExists,这个方法又搞不清楚,它的注释是“This is to check the Item exists or not”。迷惑的是:这里说的存在到底是存在于哪里?是存在于BSG的数据库中?还是存在于content中还是哪里?如果存在,进入3.3.a,否则进入3.3.b
3.3.a 用方法setProcStatCodeID将item的状态置为ITEM_STATUS_FAILED,表示item已存在,然后调用updateItemStatusNLoc更新状态。
3.3.b 调用ItemSubmissionHandler.processItem方法将其作为新的item提交到BMC。

OPFLAG_MODIFY的处理:
1. 调用modifyHandling方法,用方法getItemVOList去获得List,然后对每个ISMPItemVO调用checkISMPItemExists,这个方法的功能是“This is to verify that Item is already exist or not”。返回true表示content里已经存在该item了,进入2.1.a,否则进入2.1.b。
2.1.a 用ChangeListCreator.getUseableChangeList()去获取change list,如果成功,用addOprItemPlatform把该item的平台信息(支持的手机类型)保存。
2.2.b 用setProcStatCodeID将item的状态置为ITEM_STATUS_FAILED

OPFLAG_DELETE的处理:
1. 调用modifyHandling方法,用方法getItemVOList去获得List,然后对每个 ISMPItemVO调用checkItemAlreadyExist,“This is to check that item exists or a new item”,也是让人迷惑,搞不懂。

processContent返回到processBatchNotify,processBatchNotify调用setProcStatCodeID设置BatchStatusVO的状态。

没有评论:

发表评论