Организация интеллектуальной совместной деятельности в сфере образования с использованием Lotus Connections: Часть 3. Использование Profiles для предоставления доступа к информации о направлениях исследований

Создание пользовательских интерфейсов при помощи виджетов и Lotus Connections

В статье объясняется, как дополнить страницы IBM Lotus® Profiles информацией о направлениях научных исследований и полученных грантах. Пример приложения, из которого приводятся образцы кода, показывает, как собрать исходную информацию о грантах и публикациях и сохранить ее для дальнейшего текстового анализа. Информация упорядочивается и формируется для пользователя Profiles в виде облака тегов направлений исследований. Пользовательский интерфейс реализован с использованием двух специальных виджетов, состоящих из XML- и JavaScript-файлов.

Карл Осипов, архитектор ПО, IBM

Карл Осипов (Carl Osipov) - архитектор ПО, подразделениe стратегий и технологий IBM Software Group. Обладает большим опытом в области распределенных вычислений, разработке приложений по распознаванию живой речи и компьютерной обработке естественного языка. Имеет ряд публикаций и выступлений по вопросам Сервис-ориентированной архитектуры и управлением разпознования речи перед образовательской и бизнес аудиторией. На данный момент он в основном занимается проектированием технологий повторного использования для составных бизнес-сервисов.



Илья Афанасьев, инженер-программист, IBM

Илья Афанасьев (Ilya Afanasiev) - фотографияИлья Афанасьев (Ilya Afanasiev) - инженер-программист, имеющий более 7 лет опыта успешной работы и богатый набор навыков в различных областях, включая исследования, разработку, поддержку и обеспечение качества программного обеспечения. Поступил на работу в IBM в 2007 году в качестве программиста систем z/OS в российской лаборатории систем и технологий. В настоящее время основное внимание уделяет разработке и созданию прототипов пользовательских Web-интерфейсов, поиску информации и разработке Java EE-приложений. Интересуется глубинным анализом текста и анализом неструктурированного текста.



21.11.2011

Введение

IBM Lotus Connections представляет собой продукт для построения социальных сетей, предназначенный для современных организаций. Profiles, являющийся одним из компонентов продукта, предоставляет настраиваемый интерактивный каталог пользователей.

В статье описывается реализация расширения Lotus Connections Profiles, которое позволяет владельцам профилей дополнять страницу собственного профиля информацией о направлениях своих исследований и полученных грантах. Другие пользователи (наблюдатели страницы профиля), посетив страницу, увидят список названий грантов, полученных владельцем профиля, и облако тегов ключевых слов, основанное на направлениях исследований владельца профиля.

В приведенном в статье примере приложения в качестве источника данных для исследовательских грантов, предоставленных пользователю Profiles Национальным институтом здравоохранения США (NIH), используется Web-сайт Tracking Accountability in U.S. Government Grants System (TAGGS). Информация о грантах дает лишь частичное представление о направлениях исследований получателя. Приложение также можно настроить на сбор текстов публикаций владельца профиля в Интернете (например, статьи в журнале Diabetes). Все текстовые данные пользователя, полученные из TAGGS и интернет-публикаций, хранятся в базе данных неструктурированного (текстового) контента IBM Content Analytics, называемой коллекцией анализа текста.

С помощью Content Analytics наше приложение извлекает из коллекции анализа текстов сведения о направлениях исследований пользователя. Хотя Content Analytics предоставляет ряд возможностей для сложного анализа текста, в статье основное внимание уделяется простому анализу частоты встречаемости терминов. Выходные данные анализа представляют собой упорядоченный список наиболее часто встречающихся слов в названиях полученных грантов и резюме публикаций пользователя Profile. Список отображается на странице профиля в виде облака тегов направлений исследований.

В разделе Ресурсы приведены ссылки на информацию о продукте Lotus Connections Profiles, виджете Tag Cloud, Web-сайте TAGGS, Content Analytics и других вопросах.


Архитектура приложения

Архитектура примера приложения показана на рисунке 1. Обычно у Web-приложений серверная сторона состоит из нескольких концептуальных уровней.

Рисунок 1. Архитектура приложения
Рисунок 1. Архитектура приложения
Уровень представления (Web-уровень)
Отвечает за обработку запросов клиента Web-браузера и за отображение в браузере пользовательского интерфейса Profiles в режиме HTML. Web-уровень базируется на сервере Connections, расширенном специфичными для приложения виджетами My Grant Awards и My Keywords. Являясь расширениями Profiles, виджеты соответствуют спецификациям IBM iWidget. В обоих виджетах содержатся оформленные в виде iWidget-совместимых компонентов специальные функции, реализованые при помощи Dojo и JavaScript. Оба виджета состоят из XML- и JavaScript-файлов.

XML-файл объявляет экземпляр iWidget согласно синтаксису определений iWidget (раздел 9.1 Спецификации iWidget 1.0). В соответствии с этим синтаксисом XML-файл содержит описание JavaScript (Dojo) объекта, который визуализирует содержимое виджета. Этот XML-файл содержит также раздел с исходной HTML-разметкой и исходным JavaScript-кодом для передачи управления визуализацией пользовательского интерфейса в Dojo-объект.

JavaScript-файл содержит реализацию Dojo-объекта, отвечающего за визуализацию пользовательского интерфейса. Для извлечения данных из бизнес-уровня при помощи технологии Java Servlet объект использует асинхронные HTTP-вызовы GET и POST (dojo.xhrGet и dojo.xhrPost). Данные возвращаются в объект в виде ответа сервлета в HTTP-формате, а затем используются для перезаписи DOM Web-страницы на стороне клиента.

Бизнес-уровень
Содержит Profiles и JEE-приложения расширения. Последние содержат Java-сервлеты для поддержки виджетов My Grant Awards и My Keywords. Логика сервлетов опирается на специальные методы извлечения (в нашем случае с сайтов TAGGS или Diabetes Journal) и анализа данных (для вычисления частоты встречаемости ключевых слов, используемых в публикациях журнала Diabetes Journal).

Сервлеты возвращают сообщения HTTP-ответов в XML- или JSON-формате. Profiles и JEE-приложения расширения развертываются на WebSphere Application Server как EAR-файлы.

Уровень интеграции
Отвечает за представление механизма Web-сканирования Content Analytics и возможностей анализа текста в виде сервисов для бизнес-уровня. JEE-приложение расширения взаимодействует с Content Analytics посредством Java API. Поскольку Content Analytics не позволяет сканировать динамически сгенерированные Web-страницы, приложение имеет собственную реализацию поискового робота.

В оставшейся части статьи описываются подробности реализации функций на стороне клиента и пользовательского интерфейса для упоминавшихся выше виджетов My Grant Awards и My Keywords. Приводятся фрагменты исходного XML- и JavaScript-кода.


Виджет My Grant Awards

Виджет My Grant Awards отображает список предоставленных владельцу профиля грантов на исследования, как показано на рисунке 2.

Рисунок 2. Внешний вид виджета My Grant Awards
Рисунок 2. Внешний вид виджета My Grant Awards

Содержимое виджета представлено единственным элементом - HTML-таблицей с информацией о предоставленных грантах на исследования. В части 4 данной серии будет описано получение данных для заполнения таблицы.

XML-файл iWidget

Приведенный в листинге 13 XML-файл, на который ссылается файл widgets-config.xml, используется для объявления дополнительного виджета в настройках пользовательского интерфейса Profiles. Развертывание дополнительных виджетов для использования в Profiles описано в Приложении к данной статье.

В листинге 1 приводится содержимое XML-файла виджета My Grants Awards.

Листинг 1. XML-файл iWidget для виджета My Grant Awards
1 <iw:iwidget id="grants" xmlns:iw=http://www.ibm.com/xmlns/prod/iWidget
2 iScope="GrantsWidgetClass" 
3 supportedModes="view" 
4 title="My Grant Awards">
5 <iw:resource uri="grants.js" />
6 <iw:content mode="view">
7 <![CDATA[
8 <div id="grantsWidget">
9 <script type="text/javascript">
10 iContext.iScope().getGrantAwards();
11 </script>
12 </div>
13 ]]>
14 </iw:content>
15  </iw:iwidget>

Содержание листинга 1:

  • Строка 1: объявление, в котором определяется экземпляр iWidget с идентификатором grants.
  • Строка 2: продолжение объявления: GrantsWidgetClass - имя JavaScript-объекта.
  • Строка 3: указывает, что виджет поддерживает только режим просмотра; это означает, что пользователь Profiles не может изменить содержимое отображаемого виджета.
  • Строка 4: название виджета - My Grant Awards.
  • Строка 5: определяет раздел resource iWidget.
  • Строки 6-14: раздел content iWidget.

Раздел resource связывает объявление iWidget с файлом исходного кода, реализующего JavaScript-объект. Имя класса для этого объекта указывается в строке 2 листинга 1. Экземпляр объекта GrantsWidgetClass отвечает за визуализацию DOM виджета. Подробности реализации объекта приведены в разделе Dojo/JavaScript-код.

Раздел content содержит исходный код, который служит точкой входа для визуализации DOM виджета My Grant Awards. В строках 8 - 12 листинга 1 статический HTML-код для виджета My Grant Awards состоит из единственного элемента DIV с именем grantsWidget. В строке 10 содержимое элемента получает динамически генерируемый посредством getGrantAwards() вызов метода. Это компонентный метод JavaScript-объекта GrantsWidgetClass.

К iWidget-компонентам, которые обеспечивают общее управление для Web-страницы (например, макет), можно обращаться посредством высокоуровневого спецификатора объектов iContext. Вызов iScope() возвращает экземпляр объекта GrantsWidgetClass (строка 2), который инициализируется до загрузки iWidget.

Dojo/JavaScript-код

Реализация JavaScript-объекта GrantsWidgetClass отвечает за визуализацию DOM виджета My Grant Awards. В листинге 2 показаны Dojo-объявления в файле grants.js.

Листинг 2. Dojo-объявления в файле grants.js
1 dojo.require("dojox.xml.DomParser");
2 dojo.provide("GrantsWidgetClass");
3 dojo.declare("GrantsWidgetClass", 
4 null, 
5 { 
6 getGrantAwards: function() {
7 var userName = profilesData.displayedUser.displayName;
8 retrieveGrantsXML(userName);
9 }
10 }
11 );

В строке 1 листинга 2 определяются имена Dojox-процедур, которые будут использоваться для анализа DOM и извлечения информации. В оставшейся части кода листинга 2 объявляется Dojo-класс GrantsWidgetClass, в том числе его методы и переменные. Метод getGrantAwards класса GrantWidgetClass вызывается для заполнения HTML-тега DIV значением идентификатора grantsWidget, как показано в листинге 1. Метод GetGrantAwards() вызывает JavaScript-функцию retrieveGrantsXML с параметром, представляющим имя владельца профиля, отображаемого приложением Profiles.

Высокоуровневое описание функции retrieveGrantsXML приведено в листинге 3.

Листинг 3. Описание функции retrieveGrantsXML
1 var retrieveGrantsXML = function(authorName) {
2 /* ... */
3 var xhrArgs = {
4 url: "/pubApi/grants",
5 handleAs: "text",
6 preventCache: true,
7 content: {
8 investigator: authorName
9 },
10 load: function(data) {
11 /* ... */
12 var doc = dojox.xml.DomParser.parse(data,"text/xml");
13 var results = doc.getElementsByTagName("award");
14 /* ... */
15 },
16 error: function(error) { /* ...код обработки ошибок... */ }
17 };
18 var deferred = dojo.xhrGet(xhrArgs);
19 };

В листинге 3:

  • Строка 18: JavaScript-функция retrieveGrantsXML реализует асинхронный HTTP-запрос GET посредством вызова процедуры dojo.xhrGet.
  • Строки 3-17: инициализация аргументов для этого вызова.
  • Строка 4: при активизации GET-запроса управление передается на сторону сервера - сервлету по указанному URL.
  • Строки 7-9: передаваемые в сервлет параметры перечислены в разделе content.
  • Строки 10-15: код, отвечающий за обновления содержимого виджета, находится в функции load.

    Эта функция вызывается сразу после получения браузером ответа от сервлета. Содержимое ответа передается в переменной data, являющейся параметром функции load.

Типичный ответ генерируется сервлетом My Grant Awards в XML-формате. В листинге 4 показан пример.

Листинг 4. Типичный ответ сервлета My Grant Awards
1 <grants-list faculty="Joel Francis Habener" GAManagerVersion="1.0">
2 <award>
3 <fiscal_year>2008</fiscal_year>
4 <opdiv>NIH</opdiv>
5 <award_number>R01DK030834</award_number>
6 <award_title>GLUCAGON BIOSYNTHESIS AND METABOLISM</award_title>
7 <principal_investigator>JOEL F HABENER</principal_investigator>
8 </award>
9 </grants-list>

Результаты анализа ответа сервлета, выполненного с помощью анализатора Dojo XML DOM (строки 12-13 в листинге 3), выводятся в виде HTML-таблицы, аналогичной таблице на рисунке 2.


Виджет My Keywords

Виджет My Keywords позволяет пользователям быстро узнавать об основных направлениях исследований владельца профиля. Он отображает ключевые слова, которые чаще всего встречаются в публикациях владельца профиля, описаниях грантов и других Web-ресурсах, таких как PubMed. В отличие от виджета My Grant Awards виджет My Keywords имеет элементы управления, которые позволяют владельцу профиля настраивать внешний вид виджета и отображаемое содержимое.

Каждый пользователь профиля может переключаться между представлением в виде списка и представлением в виде облака. На рисунке 3 показано представление в виде списка.

Рисунок 3. Виджет My Keywords, представление в виде списка
Рисунок 3. Виджет My Keywords, представление в виде списка

На рисунке 4 показано представление в виде облака.

Рисунок 4. Виджет My Keywords, представление в виде облака
Рисунок 4. Виджет My Keywords, представление в виде облака

Используя дополнительные элементы управления, владелец профиля может настраивать отображаемое виджетом содержимое, как показано на рисунке 5. Например, он может выбрать несколько источников для извлечения ключевых слов или исключить некоторые ключевые слова (на рисунке 5 они называются stop words) из показа.

Рисунок 5. Виджет My Keywords, дополнительные элементы управления
Рисунок 5. Виджет My Keywords, дополнительные элементы управления

В представлении виджета в виде облака, изображенном на рисунке 4, выводятся ключевые слова для пользователя Profiles по имени Alice, просматривающей свой собственный профиль. Когда другой Profiles-пользователь Bob будет просматривать профиль Alice, виджет My Keywords выделит ключевые слова пользователя Alice, соответствующие ключевым словам в профиле пользователя Bob. На рисунке 6 показано просматриваемое пользователем Bob представление профиля пользователя Alice, в котором выделены общие ключевые слова.

Рисунок 6. Виджет My Keywords, представление в виде облака с выделением общих ключевых слов
Рисунок 6. Виджет My Keywords, представление в виде облака с выделением общих ключевых слов

XML-файл iWidget

Общая структура исходного XML-кода виджета My Keywords идентична исходному коду виджета My Grant Awards, но детали реализации существенно разнятся. В примере кода в листинге 5 создается строка со списком имен источников, используемых для извлечения ключевых слов. Названия источников можно увидеть на рисунке 5 под заголовком Extract keywords from.

Листинг 5. Построение списка источников ключевых слов
1 kwGetExtractableSources = function() {
2 str_extract_from = ";
3 if (dojo.byId("chkbox_1").checked) { 
4 str_extract_from += ",source_1";
5 }
6 if (dojo.byId("chkbox_2").checked) {
7 str_extract_from += ",source_2";
8 }
9 str_extract_from = str_extract_from.substring(1,str_extract_from.length);
10 if(str_extract_from==") {
11 str_extract_from = "default_source"; 
12 }
13 return str_extract_from; 
14 }

Строка вместе с другими параметрами передается в сервлет My Keywords.

Подобно виджету My Grant Awards, виджет My Keywords имеет свой собственный JavaScript-объект, отвечающий за визуализацию графического интерфейса. Один из методов объекта получает вызываемый из виджета My Keywords XML-файл iWidget, как показано в листинге 6. Этот метод принимает строку, представляющую собой список источников. Строка извлекается путем вызова функции, показанной в листинге 5.

Листинг 6. Первоначальное обновление содержимого виджета My Keywords
1 document.getElementById("kw_status").innerHTML += "Loading keywords...";
2 iContext.iScope().kwInitialUpdate (kwGetExtractableSources());

В листинге 7 показан код, который обрабатывает нажатия на кнопку Update current view в нижней части рисунка 5.

Листинг 7. Обработка нажатия на кнопку Update current view
1 <script type="text/javascript"> 
2 kwProcessUpdateCall = function() {
3 str_extract_from = kwGetExtractableSources();
4 iContext.iScope().kwInterimUpdate(kwGetExtractableSources(),
5 kwCurrPage, kwCurrView);
6 }
7 </script>
8 <form name=stopWordsForm>
9 <textarea name=stopWordsText id=kw_stopwords_editable cols=25 rows=5>
10 </textarea>
12 </form>
13 <input type="button" class="lotusBtn lotusBtnSpecial" name="submit_all" 
14 value="Update current view" onClick=kwProcessUpdateCall();/>

Обратите внимание на два вызываемых метода:

Эти методы являются точками входа для визуализации графического пользовательского интерфейса виджета. Более подробная информация приведена в разделе Визуализация графического пользовательского интерфейса виджета.


Основанная на ролях авторизация для элементов управления виджета

Пользователи, работающие с Lotus Connections Profile, выступают в одной из двух ролей: владельца профиля или наблюдателя профиля. Владелец профиля создает профиль и может изменять его. Наблюдатели могут просматривать профиль, но не могут его изменить.

Виджет My Grant Awards выглядит одинаково как для владельца профиля, так и для наблюдателя. Однако виджет My Keywords отображается владельцу профиля иначе, чем наблюдателю. У наблюдателей отсутствует разрешение на изменение содержимого, отображаемого виджетом My Keywords. Элементы управления, доступные для владельца профиля, показаны на рисунке 5.

Основанная на ролях авторизация виджета реализована в Dojo-функции onLoad, которую вызывает Dojo после завершения процесса загрузки виджета. Функция onLoad, показанная в листинге 8, использует две переменные:

  • pObserved - представляет пользователя, чей профиль просматривается в данный момент.
  • pLoggedIn - представляет пользователя, вошедшего в данный момент в приложение Profiles.
Листинг 8. Основанная на ролях простая авторизация при помощи Dojo-функции onLoad()
1 onLoad: function () {
2 var pObserved = this.personObserved;
3 var pLoggedIn = this.personLoggedIn;
4 if(pObserved != null & pLoggedIn != null & pObserved == pLoggedIn) {
5 dojo.byId('kw_cust_expand').style.display = ";
6 }
7 }

В зависимости от результата посимвольного сравнения этих двух переменных HTML-элемент с идентификатором kw_cust_expand либо отображается, либо нет. Этот HTML-элемент представляет ссылку Customize this view, как показано на рисунках 3 и 4. Так как виджет загружается только один раз (когда браузер загружает страницу Profiles), нет необходимости постоянно поддерживать авторизацию роли.

Важно отметить, что метод kwInitialUpdate вызывается кодом инициализации виджета My Keywords (см. листинг 6) до загрузки виджета. Dojo-функция onLoad вызывается после вызова метода kwInitialUpdate, поэтому kwInitialUpdate инициализирует объектные переменные personObserved и personLoggedIn, используемые Dojo-функцией onLoad.

Визуализация графического пользовательского интерфейса виджета

Две точки входа (два метода) для визуализации графического пользовательского интерфейса виджета обсуждались ранее (см. листинги 6 и 7):

  • kwInitialUpdate для обновления содержимого виджета при первоначальной загрузке;
  • kwInterimUpdate для обновления содержимого виджета после нажатия пользователем кнопки Update current view (см. рисунок 5).

Первоначальное обновление содержимого виджета осуществляется с помощью вызова функции kwUpdateContents, как показано в строке 4 листинга 9.

Листинг 9. Реализации методов первоначального и промежуточного обновления виджета My Keywords
        1 kwInitialUpdate: function(extractableSources) { 
        2 /* initialization of personObserved and personLoggedIn */
3 /* ... */
4 kwUpdateContents(this,personObserved,0);
5 }
6 kwInterimUpdate: function(extractableSources, currPageId, currView) { 
7 /* ... */
8 kwUpdateStopWords(this, personLoggedIn,extractableSources,currPageId);
9 }

В листинге 10 показана реализация функции, рассмотренной выше.

Листинг 10. Реализация асинхронного HTTP-вызова GET для виджета My Keywords
1 var kwUpdateContents = function(kwClassInstance,investigatorName,currPage) {
2 var xhrArgs = {
3 url: "/termsfrequency_proxy/termsfrequency",
4 handleAs: "text",
5 preventCache: true,
6 content: {
7 investigator: investigatorName,
8 compare_with: kwClassInstance.personLoggedIn,
9 extract_from: termsSources, 
10 threshold: 2
11 }, 
12 load: function(data) {
13 /* ... */
14 kwClassInstance.xmlParsed = dojox.xml.DomParser.parse(data);
15 kwUpdateWidgetInternals(kwClassInstance,currPage);
16 /* ... */
17 },
18 error: function(error) {
19 /* обработка ошибок ... */
20 }
21 };
22 var deferred = dojo.xhrGet(xhrArgs);
23 };

В листинге 10 HTTP-запрос GET вызывается асинхронно с использованием URL /termsfrequency_proxy/termsfrequency и параметров запроса из раздела content (строки 6-11). Когда HTTP-запрос GET возвращает данные, функция load выполняет визуализацию графического пользовательского интерфейса, вызывая инкапсулированную в функции kwUpdateWidgetInternals реализацию.

Метод kwInterimUpdate вызывает функцию kwUpdateStopWords, которая (в отличие от kwUpdateContents) вызывает асинхронный HTTP-запрос POST. После обработки HTTP-запроса POST на стороне сервера управление возвращается функции kwUpdateStopWords, которая вызывает kwUpdateContents (см. строки 14 и 15 в листинге 11).

Листинг 11. Реализация асинхронного HTTP-вызова POST для виджета My Keywords
1 var kwUpdateStopWords = 
2 function(kwClassInstance,userName,termsSources,currPage) {
3 var stopWordsEditable = dojo.byId("kw_stopwords_editable");
4 var stopWordsGiven = ";
5 if(stopWordsEditable.value != "Add your own stop words to here...") {
6 stopWordsGiven = stopWordsEditable.value; 
7 }
8 var xhrArgs = {
9 url: "/termsfrequency_proxy/termsfrequency",
10 postData: "updated_stopwords_list="+stopWordsGiven+"+
11 "&investigator="+username+"&terms_sources="+termsSources,
12 error: function(error) {/* ... обработка ошибок ... */}
13 };
14 var handler = dojo.xhrPost(xhrArgs);
15      handler.addCallback(kwUpdateContents(kwClassInstance,userName,currPage));
16 };

Использование виджета Dojo Tag Cloud

Для отображения пользователю ключевых слов в виде облака (см. рисунки 4 и 6) используется метод kwDisplayCloudView. Облако реализовано с помощью объекта Dojo Tag Cloud, который создается с нуля каждый раз, когда обновляется виджет My Keywords.

Виджет Dojo Tag Cloud работает с предназначенным только для чтения хранилищем данных dojo.data.ItemFileReadStore. Во время инициализации виджета в хранилище данных помещаются следующие метаданные: список ключевых слов и частота их встречаемости, а также дополнительная разметка, которая будет использоваться для визуализации соответствующего облака тегов. Ответ сервлета My Keywords заполняет хранилище данных XML- и JSON-представлениями ключевых слов и частоты их встречаемости. Виджет My Keywords использует XML в режиме списка и JSON в режиме облака.

В листинге 12 показана реализация логики визуализации виджета Dojo Tag Cloud.

Листинг 12. Реализация виджета dojo.TagCloud
1 kwDisplayCloudView: function() {
2 var kwCloudDivName = "kw_cloud_placeholder";
3 var kwCloudRootName = "kw_cloud_root";
4 if(this.oCloud == null) {
5 this.jsonStore = 
6           new dojo.data.ItemFileReadStore({data:this.termsJson,clearOnClose:true});
7 var kwCloudDiv = dojo.byId(kwCloudDivName);
8           this.oCloud = new myDojo.TagCloud({store: this.jsonStore},kwCloudDiv);
9 } else {
10 this.jsonStore.close();
11 this.jsonStore._jsonData = this.termsJson;
12 this.jsonStore.fetch();
13 this.oCloud.destroy();
14 kwCreateCloudDiv(kwCloudDivName, kwCloudRootName);
15 var kwCloudDiv = dojo.byId(kwCloudDivName);
16          this.oCloud = new myDojo.TagCloud({store: this.jsonStore},kwCloudDiv);
17 }
18 }
19
20 var kwCreateCloudDiv = function(divName, rootName) {
21 _kwCreateCloudDiv_impl('div', {id: divName, widgetid: "}, rootName);
22 }
23
24 _kwCreateCloudDiv_impl = function(tag, attrs, ref, pos){
25 var n = dojo.doc.createElement(tag);
26 if(attrs) dojo.attr(n, attrs);
27 if(ref) dojo.place(n, ref, pos);
28 return n;
29 }

Содержимое листинга 12:

  • Строки 5-8: обработка исходного объекта dojo.TagCloud.
  • Строки 10-16: очистка ранее созданного объекта dojo.TagCloud и связанного с ним хранилища данных, предназначенного только для чтения.
  • Строки 2, 7, 8: исходный объект dojo.TagCloud прикрепляется к предварительно созданному DOM-элементу: все последующие созданные заново объекты dojo.TagCloud делают то же самое, сначала уничтожая DOM-элемент.
  • Строки 14, 15 и 20-29: данный DOM-элемент создается с нуля, после чего внутри этого DOM-элемента создается dojo.TagCloud.

Заключение

В статье демонстрируется практическое применение интеграции IBM Lotus Connections и IBM Content Analytics, позволяющей пользователям Connections предоставлять широкий доступ к информации о направлениях своих исследований и полученных ими грантах. В статье представлена архитектура приложения и подробно описаны виджеты iWidgets My Keywords и My Grant Awards. Вы познакомились с HTML- и JavaScript-реализацией виджетов с использованием Dojo. Примеры исходного кода помогли проиллюстрировать авторизацию на основе ролей Profiles. Вы также узнали, как реализовать HTTP-взаимодействие между виджетами и Java-сервлетами.

Часть 4 серии будет посвящена реализации сервлета и интеграции с Content Analytics.


Приложение

Развертывание дополнительных виджетов в приложении Profiles

Путь к XML-файлам, объявляющим виджеты, обсуждаемые в статье, указывается в конфигурационном файле виджетов widgets-config.xml. Чтобы настроить существующие виджеты или сделать доступными в Profiles собственные виджеты, необходимо изменить настройки в файле widgets-config.xml. Подробности приведены в документе Настройка виджетов в Profiles (EN). Этот конфигурационный файл используется для настройки содержимого пользовательского интерфейса Lotus Connections Profiles.

В листинге 13 приведен пример XML-файла объявления виджета My Grant Awards как части определения виджета My Grant Awards в конфигурацонном файле виджета Profiles.

Листинг 13. Определение виджета My Grant Awards в файле widgets-config.xml
<widgetDef defId="myGrantAwards" bundleRefId="extraBundle" 
           url="{context_root}/extra-widgets/grantsWidget.xml?version={version}"/>

Ресурсы

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Lotus
ArticleID=775991
ArticleTitle=Организация интеллектуальной совместной деятельности в сфере образования с использованием Lotus Connections: Часть 3. Использование Profiles для предоставления доступа к информации о направлениях исследований
publish-date=11212011