是否可以使用 OpenCMIS API 在 Alfresco 站点上创建文件夹?

Is it possible to create a folder on the Alfresco site by using OpenCMIS API?

我有 Presentation Web Script (script A) and the Data Web Script (script B).

script A 中,我构建了与 script B 交互的对话框。

我在这里形成了一些文件将被上传的路径(groupyearnumber 参数定义了这个路径):

...
var submitHandler = function() {
    var dataWebScriptUrl = window.location.protocol + '//' + 
        window.location.host + "/alfresco/s/ms-ws/script-b?guest=true";

    var yearCombo = document.getElementById("year");
    var year = yearCombo.options[yearCombo.selectedIndex].value;

    var groupCombo = document.getElementById("group");
    var group = groupCombo.options[groupCombo.selectedIndex].value;

    var numberCombo = document.getElementById("number");
    var number = numberCombo.value;

    var uploadedFile = document.getElementById("uploadedFile");
    var file = uploadedFile.files[0];

    var formData = new FormData();
    formData.append("year", year);
    formData.append("group", group);
    formData.append("number", number);
    formData.append("uploadedFile", file);      

    var xhr = new XMLHttpRequest();
    xhr.open("POST", dataWebScriptUrl);
    xhr.send(formData);
};
...

script B 中,我正在使用 Apache Chemistry OpenCMIS API to create a path in the CMIS 兼容的 Alfresco 存储库:

public class CustomFileUploader extends DeclarativeWebScript implements OpenCmisConfig {
    ...
    private void retrievePostRequestParams(WebScriptRequest req) {
        String groupName = null, year = null, number = null;

        FormData formData = (FormData) req.parseContent();
        FormData.FormField[] fields = formData.getFields();
        for(FormData.FormField field : fields) {
            String fieldName = field.getName();
            String fieldValue = field.getValue();

            if(fieldName.equalsIgnoreCase("group")) {
                if(fieldValue.equalsIgnoreCase("services")) {
                    groupName = "Услуги";
                ...                         
        }

        firstLevelFolderName = "/" + groupName;
        secondLevelFolderName = groupName + " " + year; 
        thirdLevelFolderName = number;
    }

    ...

    Folder firstLevelFolder = 
                createFolderIfNotExists(cmisSession, docLibFolder, firstLevelFolderName);

    ...

    private Folder createFolderIfNotExists(Session cmisSession, 
            Folder parentFolder, String folderName) {
        Folder subFolder = null;
        for(CmisObject child : parentFolder.getChildren()) {
            if(folderName.equalsIgnoreCase(child.getName())) {
                subFolder = (Folder) child;
            }
        }

        if(subFolder == null) {
            Map<String, Object> props = new HashMap<>();
            props.put("cmis:objectTypeId", "cmis:folder");
            props.put("cmis:name", folderName);

            subFolder = parentFolder.createFolder(props);
        }
        return subFolder; 
    }

    private Folder getDocLibFolder(Session cmisSession, String siteName) {
        String path = "/Sites/" + siteName + "/documentLibrary";
        return (Folder) cmisSession.getObjectByPath(path);
    }

    private Session getCmisSession() {
        SessionFactory factory = SessionFactoryImpl.newInstance();
        Map<String, String> conf = new HashMap<>();

        // http://localhost:8080/alfresco/api/-default-/public/cmis/versions/1.1/atom
        conf.put(SessionParameter.ATOMPUB_URL, ATOMPUB_URL);
        conf.put(SessionParameter.BINDING_TYPE, BindingType.ATOMPUB.value());
        conf.put(SessionParameter.USER, USER_NAME);
        conf.put(SessionParameter.PASSWORD, PASSWORD);

        // "org.alfresco.cmis.client.impl.AlfrescoObjectFactoryImpl"
        conf.put(SessionParameter.OBJECT_FACTORY_CLASS, OBJECT_FACTORY_CLASS);
        conf.put(SessionParameter.REPOSITORY_ID, "-default-");

        Session session = factory.createSession(conf);

        return session;
    }

    ...

一切正常...但我需要在特定站点上创建目录结构,例如"contracts-site",此处:

/site/contracts-site/documentlibrary

当我指定以下内容时:

/Sites/contracts-site/documentLibrary/Услуги
/Sites/contracts-site/Услуги
/site/contracts-site/documentlibrary/Услуги

我得到以下异常(取决于路径):

org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException: Object not found: /Sites/contracts-site/Услуги

当我指定以下内容时:

"/Услуги"

一切正常,但目录结构是在站点外创建的...

如何使用 OpenCMIS 在 Alfresco 站点上创建文件夹 API?

你不是想念 /company_home/ 吗?

这会导致

/company_home/Sites/contracts-site/documentLibrary/Услуги

只是无意中找到了解决办法。如果指定以下路径,则完美运行:

// locate the document library
String path = "/Сайты/contracts-site/documentLibrary";

"Сайты" 而不是 "Sites"...(西里尔字母)

我正在使用 ru_RU 语言环境和 UTF-8 编码。然后 this example 也有效。