【问题标题】:CMIS Versioning not working as expectedCMIS 版本控制未按预期工作
【发布时间】:2015-07-08 21:51:18
【问题描述】:

我正在使用以下代码使用 CMIS API 在我的文档服务上创建一个文件:

zipMapFile.put(PropertyIds.OBJECT_TYPE_ID, "sap:versioned");
zipMapFile.put(PropertyIds.NAME, "g" + g.getId() + ".zip");
Document versionedDocument = openCmisSession.getRootFolder().createDocument(zipMapFile, contentStream, VersioningState.MAJOR);
newZipFileId = versionedDocument.checkOut();
...

上面的代码正在运行,并且文件正在正确生成。当我运行以下代码时:

cmisSession.getObject(newZipFileId.getId());

我得到了我之前创建的文件,没有错误。

但是,当我尝试为此文件上传新版本时遇到问题。

为此,我使用以下代码:

oldZipFileId = newZipFileId;
Document pwc = (Document) cmisSession.getObject(oldZipFileId);
pwc.setContentStream(contentStream, true);
newZipFileId = pwc.checkIn(false, null, null, null);

每当我这样做时,我都可以毫无问题地访问较新的版本,运行以下代码:

cmisSession.getObject(newZipFileId.getId());

但是,我不能再访问旧版本了!如果我尝试运行:

cmisSession.getObject(oldZipFileId);

我得到一个 CmisObjectNotFoundException

我失去对旧版本的访问权限的那一刻正是方法 pwc.checkIn(false, null, null, null); 执行的时候。在此调用之后,尝试获取 oldZipId 引用的对象会给我一个 CmisObjectNotFoundException。

我正在使用 MongoDB。

感谢任何帮助!谢谢!

【问题讨论】:

    标签: java versioning cmis


    【解决方案1】:

    工作代码应如下所示:

    Document versionedDocument = openCmisSession.getRootFolder().createDocument(zipMapFile, contentStream, VersioningState.MAJOR);
    oldZipFileId = versionedDocument.getId();
    
    newZipFileId = versionedDocument.checkOut();
    Document pwc = (Document) cmisSession.getObject(newZipFileId);
    pwc.setContentStream(contentStream, true);
    newZipFileId = pwc.checkIn(false, null, null, null);
    
    // access last version
    cmisSession.getObject(newZipFileId.getId());
    
    // access old version
    cmisSession.getObject(oldZipFileId);
    

    【讨论】:

      【解决方案2】:

      虽然我不是 HCP 文档服务版本控制方面的专家,但您编写的所有内容都按照 AFAIK 的设计工作。当您签入 pwc 时,会有一个新的实际版本(历史上的最新版本),而 pwc 已经消失了。因此,您标识 pwc 的 oldZipFileId 变得无效。 pwc 成为的新的实际版本会获得一个新的对象 ID。这似乎正是您观察到的。

      【讨论】:

      • 所以我不能再访问旧版本了?我认为使用 CMIS 版本控制我可以访问文档的所有版本
      【解决方案3】:

      查看旧版本是否在document.getAllVersions()

      【讨论】:

      • 没有。当 createDocument() 方法被执行时,一个版本被创建并且 getAllVersions() 返回版本。在下一行中,当执行 pwc.checkOut() 时,会创建一个新版本,并且 getAllVersions() 返回两个版本。但是,当通过调用 pwc.checkIn() 创建一个真正的新版本时,getAllVersions() 仍然只返回两个版本。由 createDocument() 创建的第一个版本没有丢失(它仍然存在),但是,由 checkout() 方法创建的第二个版本被 checkIn() 方法创建的新版本替换。
      • 不知道有没有说清楚,如果看不懂请告诉我
      • checkIn后getAllVersions()返回的两个Document是否正确?检查 getAllVersions 返回的对象的 contentStream 和属性。以前对 Document 对象的引用可能会在签入后更改。还有,我觉得PWC在checkIn成功后消失也是可以的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多