IBM SBT: создайте папку в сообществе

Я получаю в руки SBT Toolkit с Java. Прекрасно работает, но с некоторыми трудностями с папками:

Мне нужно создать папку в сообществе и поместить в нее несколько файлов. К сожалению, класс CommunityService не имеет такого метода.

Я мог бы использовать FileService.createFolder(name, description, shareWith) метод и поделиться им с сообществом, но на самом деле я хочу только файлы в сообществе, потому что в противном случае они видны в приложении файлов (общедоступное, предупреждающее сообщение: "Общий доступ к общему сообществу" ИМЯ ОБЩИНЫ "сделает эту папку общедоступной ".)

Как мне этого добиться?

Я проверил кнопку в виджете сообщества / файлов и обнаружил, что он выполняет POST для фида сообществ:

Целевой URL: https://connections.host.ch/files/form/api/communitycollection/{community-uuid}/feed

Содержание POST:

<entry xmlns="http://www.w3.org/2005/Atom">
  <category term="collection" label="collection" scheme="tag:ibm.com,2006:td/type"></category>
  <label xmlns="urn:ibm.com/td" makeUnique="true">TEST Folder</label>
  <title>TEST Folder</title>
  <summary type="text">teset set e</summary>
</entry>

Итак, могу ли я использовать communityService.createData способ вызвать эту службу REST? Если да, какой синтаксис? Я не нашел никакой документации или примеров для этого.

Кроме того, мне нужно получить идентификатор папки после того, как она создана, но я это могу разобрать из ответа..

Добавление файлов во вновь созданную папку должно быть простым (SBT предоставляет соответствующие классы и методы), но я еще не работал с этим:-)

2 ответа

Я нашел решение... хотя я бы предпочел использовать JSON, и, возможно, дескриптор XML-документа Xerces не очень элегантен, поскольку у меня нет с ним опыта... но он работает...

    public String createFolderInCommunity() {

    String folderId = "";

    try {

        // this is the atom entry.. would be nices if it was JSON..
        String entry = "<entry xmlns=\"http://www.w3.org/2005/Atom\" xmlns:app=\"http://www.w3.org/2007/app\" xmlns:snx=\"http://www.ibm.com/xmlns/prod/sn\">"
                + "<category term=\"collection\" label=\"collection\" scheme=\"tag:ibm.com,2006:td/type\"></category>"
                + "<label xmlns=\"urn:ibm.com/td\" makeUnique=\"true\">TESTssss4444</label>"
                + "<title>Test: "
                + (new Date()).toString()
                + "</title>"
                + "<summary type=\"text\">teset set e</summary>"
                + "</entry>";

        // Request URI with the Community ID.. of course the community id
        // will be given as a parameter
        String requestUri = "/files/form/api/communitycollection/1802d0e8-f6b8-4d51-8db0-75997ed83489/feed";
        String payload = entry;

        // here would be the point of using APPLICATION_JSON, but did not
        // find any documentation about the JSON Object format :-(
        ClientService.ContentString cc = new ClientService.ContentString(
                payload, CommonConstants.APPLICATION_ATOM_XML);

        // create the service uppon the IBM Connections endpoint (in this
        // case SSO)
        Response response = getEndPoint().getClientService().post(
                requestUri, cc);

        // Getting the object as a apache xerces DeferredDocumentImpl, with
        // which i have absolutely no experience..
        DeferredDocumentImpl obj = (DeferredDocumentImpl) response
                .getData();

        NodeList lstNodes = obj.getFirstChild().getChildNodes();

        // so getting the value this way might be clumsy, but it works...
        for (int x = 0; x < lstNodes.getLength(); x++) {
            String name = lstNodes.item(x).getNodeName();
            if (name.equals("td:uuid")) {
                folderId = lstNodes.item(x).getFirstChild()
                        .getTextContent();
                break;
            }
        }
    } catch (Exception e) {
        Util.logError(e);
    }

    return folderId;
}

Добавить файлы в папку сообщества довольно просто, я просто работал над этим и решил поделиться с вами своим решением.

Я использую последнюю версию файла ядра: com.ibm.sbt.core-1.1.0.20140717-1200.jar

Класс com.ibm.sbt.services.client.connections.files.FileService уже есть метод, чтобы добавить файл либо MYUSERLIBRARY или же USERLIBRARY, Единственное, что вам нужно изменить, это requestUri,

public void addFileToCommunityFolder(String communityId, String fileId, List<String> folderIds, Map<String, String> parameters) throws ClientServicesException {
    String accessType = AccessType.AUTHENTICATED.getText();
    // COMMUNITY_FILE_FEED : {files}/{authType}/{accessType}/communitylibrary/{communityId}/document/{fileId}/feed
    String requestUri = FileUrls.COMMUNITY_FILE_FEED.format(this, FileUrlParts.accessType.get(accessType), FileUrlParts.communityId.get(communityId), FileUrlParts.fileId.get(fileId));

    Map<String, String> headers = new HashMap<String, String>();
    headers.put(Headers.ContentType, Headers.ATOM);
    headers.put(Headers.ContentLanguage, Headers.UTF);

    parameters = (null == parameters) ? new HashMap<String, String>() : parameters;
    String payload = new EntityIdSerializer(folderIds,FileConstants.CATEGORY_COLLECTION).fileIdListPayload();
    Response response = createData(requestUri, parameters, headers, payload);
    checkResponseCode(response, HTTPCode.NO_CONTENT);
}

Обратите внимание, что невозможно добавить файл в несколько папок сообщества. Это может быть поддержано в будущем

Редактировать:

Посмотрев на создание папки в сообществе, вы можете легко создать папку в сообществе, изменив public File createFolder(File folder) throws ClientServicesException метод в com.ibm.sbt.services.client.connections.files.FileService

public File createCommunityFolder(String communityId, File folder) throws ClientServicesException {
    String accessType = AccessType.AUTHENTICATED.getText();

    // COMMUNITY_COLLECTIONS_FEED : {files}/{authType}/{accessType}/communitycollection/{communityId}/feed
    String requestUri = FileUrls.COMMUNITY_COLLECTIONS_FEED.format(this, FileUrlParts.accessType.get(accessType), FileUrlParts.communityId.get(communityId));
    String payload = new FileSerializer(folder).generateFileUpdatePayload();

    Response response = createData(requestUri, null, new ClientService.ContentString(payload, CommonConstants.APPLICATION_ATOM_XML));
    checkResponseCode(response, HTTPCode.CREATED);
    File r = getFileFeedHandler().createEntity(response);
    folder.clearFieldsMap();
    folder.setDataHandler(r.getDataHandler());
    return folder;
}

Обязательно установите категорию (= коллекция) в вашем File объект, или он вернет One or more of the following required paramters are missing: itemId. ошибка.

Другие вопросы по тегам