我正在编写一个与Alfresco社区4.2接口的自定义应用程序。我有一个集成的自定义数据模型,并且让我感到懊恼的是我无法使用CMIS复制文档,因为自定义方面无法识别(如this issue)。我想,我可以手动复制所有属性并根据需要设置类型,但我想到了使用内置复制操作来完成我的任务,并通过REST API调用此操作。好像这应该正确复制自定义类型,不是吗?
1)这听起来像是一种好方法吗?
2)如何通过REST调用复制操作?我甚至无法弄清楚我应该使用的URL。我已经看过一些文档,但还没能解决它。
谢谢!
答案 0 :(得分:5)
您正在使用4.2.e,因此,正如Gagravarr所说,使用OpenCMIS Extension for Alfresco在CMIS 1.0中支持方面。在4.2.e中支持的CMIS 1.1中,作为secondaryTypes(方面的同义词)。
需要注意的重要一点是,在4.2中,CMIS URL已更改。如果要使用CMIS 1.0 AtomPub,则URL为:
http://localhost:8080/alfresco/api/-default-/public/cmis/versions/1.0/atom
如果您想使用CMIS 1.1 AtomPub,则URL为:
http://localhost:8080/alfresco/api/-default-/public/cmis/versions/1.1/atom
鉴于这些URL,Alfresco 4.2.e,OpenCMIS 0.10.0和OpenCMIS扩展0.7,以下是运行此代码的结果:
Document sourceDoc = (Document) cmisSession.getObjectByPath("/Someco/Whitepapers/whitepaper2.txt");
Folder targetFolder = (Folder) cmisSession.getObjectByPath("/destinationFolder");
sourceDoc.copy(targetFolder);
其中whitepaper2.txt是具有多个自定义方面和自定义元数据集的文档:
CMIS 1.0 AtomPub,没有OpenCMIS扩展:在没有自定义方面的情况下复制成功。
CMIS 1.0 AtomPub,OpenCMIS扩展:复制失败,出现IllegalArgumentException。
CMIS 1.1,没有OpenCMIS扩展(不需要):复制成功所有自定义方面和 财产价值不变。
所以答案是在针对4.2.x运行时使用CMIS 1.1支持。
答案 1 :(得分:1)
public static void copyDocument(Folder parentFolder, Document toCopyDocument) {
Map<String, Object> documentProperties = new HashMap<String, Object>(2);
documentProperties.put(PropertyIds.NAME, toCopyDocument.getName());
// Retrieve aspects for this document - NEW
Iterator<ObjectType> aspects = ((AlfrescoDocument)toCopyDocument).getAspects().iterator();
String aspectIds = "";
while (aspects.hasNext()) {
aspectIds += ',';
aspectIds += aspects.next().getId();
}
documentProperties.put(PropertyIds.OBJECT_TYPE_ID,
toCopyDocument.getBaseTypeId().value() + aspectIds);
toCopyDocument.copy(parentFolder, documentProperties, null, null, null,
null, null);
}
所以基本上你正在检索方面并'重新发送'它们。