IBM SBT: Обновление подсообщества нарушает связь между общинами?
Я реализовал создание подсообществ с использованием IBM SBT 1.0.2.20140527-1807 против IC 4.5 (спасибо за серьезные изменения API с 1.0.1:-/) и хочу обновить только что созданное подсообщество с хорошим "контентом", содержащим некоторый HTML со ссылками к некоторому контенту внутри этого сообщества. Таким образом, я должен сначала создать дочернее сообщество, а затем обновить атрибут "контент", потому что мне нужны некоторые данные, которых еще не было до успешного создания.
Я делаю это в основном следующим образом:
(1) Create subcommunity [proven successful, and it IS a subcommunity now]
(2) Fetch the new subcommunity using CommunityService.getCommunity(communityUuid) [proven successful]
(3) execute community.setContent(string) [no errors]
(4) execute CommunityService.updateCommunity(community) [no errors]
Запрос REST, созданный и отправленный для CREATE:
POST /communities/service/atom/community/subcommunities?communityUuid=8ea4ff45-ef58-4c9b-b131-def2d3e233f7
Отправленные данные XML:
<?xml version="1.0" encoding="UTF-8"?>
<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">
<title type="text">mytitle</title>
<content type="html">mycontent</content>
<category term="community" scheme="http://www.ibm.com/xmlns/prod/sn/type"></category>
<category term="mytag"></category>
<snx:communityType xmlns:snx="http://www.ibm.com/xmlns/prod/sn">private</snx:communityType>
</entry>
Запрос REST, созданный и отправленный для UPDATE:
PUT /communities/service/atom/community/instance?communityUuid=ae63bedf-98f2-45d4-ad6a-4dfd1f3a58d7
Отправленные данные XML:
<?xml version="1.0" encoding="UTF-8"?>
<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">
<title type="text">mytitle</title>
<content type="html">mycontent</content>
<category term="community" scheme="http://www.ibm.com/xmlns/prod/sn/type"></category>
<category term="mytag"></category>
<snx:communityType xmlns:snx="http://www.ibm.com/xmlns/prod/sn">private</snx:communityType>
<snx:communityUuid xmlns:snx="http://www.ibm.com/xmlns/prod/sn">ae63bedf-98f2-45d4-ad6a-4dfd1f3a58d7</snx:communityUuid>
<id>http://communities.ibm.com:2006/service/atom/community/instance?communityUuid=ae63bedf-98f2-45d4-ad6a-4dfd1f3a58d7</id>
</entry>
После этого контент действительно обновляется - но сообщество больше не является общиной, а является обычным сообществом высшего уровня.
Это почему?
Что я могу с этим поделать?
2 ответа
IBM SBT SDK 1.1.0 от 17 июля 2014 года, похоже, вышел. По крайней мере, это доступно в Maven Central.
Это лучший ответ, конечно, но он потребует нескольких корректировок кода, если вы создали код поверх внутренних структур из-за некоторых внутренних рефакторингов.
Для нетерпеливых: я нашел основную причину, и в некоторых обстоятельствах это дает возможность обходного пути.
Основная причина заключается в том, что представительство сообщества в IBM SBT SDK (Java) в настоящее время (по состоянию на июль 2014 года) не предлагает элемент "URL родительского сообщества".
http://www-10.lotus.com/ldd/appdevwiki.nsf/xpDocViewer.xsp?lookupName=IBM+Connections+4.5+API+Documentation#action=openDocument&res_title=Community_entry_content_ic45&content=pdcontent говорит, что представление сообщества XML имеет <link rel="http://www.ibm.com/xmlns/prod/sn/parentcommunity" type="application/atom+xml" href="..." />
элемент (где href
это atom/instance
URL, а не "URL сообщества" с html/communityview
) если он представляет собой подсообщество, которое игнорируется в PUT / POST - но:
ЭТО НЕПРАВДА:
Фактически, этот элемент ТРЕБУЕТСЯ для PUT, чтобы сохранить природу "подобщества" сообщества. И что еще хуже: если оно сломано, его нельзя "починить": из-за других ограничений для сообществ, существующее сообщество не может быть изменено, чтобы стать сообществом другого сообщества высшего уровня. Подсообщества могут быть только СОЗДАНЫ (и сохранены, конечно).
Чтобы обойти эту ловушку, я создал подкласс Community и некоторые другие классы для расширения механизмов маршала / демаршала XML в SBT SDK, чтобы справиться с URL родительского сообщества. Если вы знаете, что делаете, все в порядке, но если вам нужен общий код, который просто не нарушает сообщества, вы должны также ПРОЧИТАТЬ ВСЕ СООБЩЕСТВА, как если бы они могли быть сообществами. Если вы этого не сделаете, вы не увидите эту информацию и не напишете сообщество как сообщество высшего уровня.
Так что лучше подождать, если сможешь:-(
Я ожидаю, что IBM расширит реализацию сообщества и связанных классов с помощью поля URL родительского сообщества. Что меня интересует, так это то, как они будут справляться с тем, что требуется полный URL-адрес фида Atom, включая адрес сервера и UUID родительского сообщества. Я выбрал способ q&d и изменил URL-адрес сообщества, возвращаемый parentCommunity.getCommunityUrl(), но в конечном итоге это не учитывает различные варианты AUTH.