Получение статистики использования с помощью IBM Lotus Quickr: Измерение успешности сотрудничества в группеИсточник: ibm Джимм Антилл; Нэн Ши; Джон Брунн
ВведениеСтатистические данные по отдельным местам (place) содержат полезную информацию о местах, включая количество документов в конкретном месте, количество измененных сегодня документов, количество документов в библиотеке и т.д. Эта информация полезна для владельцев мест и для администратора сервера. Кроме того, эту статистику можно просматривать с помощью простого пользовательского интерфейса, доступного из темы, а также загружать в формате CSV, который импортировать в электронную таблицу. В этой статье мы сделаем эти статистические данные более удобными для использования владельцами мест. Мы собираемся сделать следующее:
Полученный в итоге интерфейс пользователя в удобной форме демонстрирует владельцам мест статистику о контенте, о росте и о "здоровье" соответствующего места. Все необходимые материалы для развертывания виджета Place Statistics содержатся в EAR-файле, приложенном к этой статье. В разделе "Развертывание" описывается, как установить этот виджет и как внести в тему изменения, позволяющие получить доступ к новой функции. Сервлет Place StatisticsНачнем с построения сервлета для получения статистических данных о месте. Этот сервлет использует существующий фид \adminqcs, добавляя к нему возможности для вывода сведений в формате JSON. Вывод в формате JSON упрощает использование JavaScript-компонентов в выходном фиде. На рис. 1 показано, как взаимодействуют компоненты сервлета. После поступления запроса выполняется получение данных из фида \adminqcs в формате Atom или в формате CSV в зависимости от необходимого конечного формата. Извлечение данных осуществляется с помощью компонента FeedRetriever. Затем эти данные передаются в компонент FeedHandler, который обеспечивает вывод статистических данных в надлежащем формате. К примеру, если нам нужен формат JSON, мы получаем вывод в формате JSON, а не в формате Atom или CSV. Рис. 1. Сервлет Place Statistics АвторизацияСтатистические данные места могут быть получены любым лицом с ролью менеджера этого места или любым лицом с ролью, имеющей полномочия Manage Membership (управление членством). Сервлет Place Statistics, описанный в этой статье, не предоставляет никаких дополнительных возможностей авторизации. Класс PlaceStatisticsRetriever в примере программного кода содержит метод Feed retriever: Потребление фида Place StatisticsСуществующий фид Для извлечения каждого из этих фидов требуется свой программный код, поскольку они представляются в различных форматах; CSV представляется в виде потока, а Atom оформлен в виде XML-документа. Необходимое нам поведение является общим для двух форматов, поэтому оно может быть выражено с помощью интерфейса, реализуемого каждым из создаваемых нами компонентов типа feed retriever ("извлекатель фида"). Этот интерфейс показан в Листинге 1. Листинг 1. Интерфейс #BaseFeedRetriever
Метод Мы создаем классы, расширяющие этот интерфейс, которые предоставляют свою собственную реализацию метода Если станут доступны другие типы выходных данных сервиса \adminqcs, вы сможете создать класс для обработки фидов этих типов без ущерба для классов, обрабатывающих фиды в форматах Atom и CSV. Получение Atom-фида Класс AtomFeedRetriever используется для получения Atom-версии фида Place Statistics. С помощью Apache Abdera подается HTTP-запрос к сервису \adminqcs. Кроме того, Abdera используется для обработки возвращенных данных и для выполнения некоторых других действий в рамках проекта. Нам потребуются экземпляр класса AbderaClient и экземпляр класса RequestOptions, которые будут использоваться для передачи (в рамках запроса) любых опций, таких как cookie-файлы. Один из параметров в методе getFeed представляет собой массив cookie-файлов. Некоторые из cookie-файлов в исходном запросе сервлета представляют собой cookie-файлы LTPA, которые продукт WebSphere Portal использует для аутентификации. Сначала создается экземпляр класса org.apache.abdera.protocol.client.RequestOptions, а затем настраиваются детали cookie-файлов. Cookie-файлы должны быть определены как массив строк, по одной строке на каждый cookie-файл, при этом каждая строка имеет форму:
Мы осуществляем прохождение по cookie-файлам и формируем строковый массив, каждый элемент которого соответствует одному cookie-файлу, а затем используем этот массив для настройки объекта RequestOptions, как показано в листинге 2. Листинг 2. Настройка cookie-файлов для запроса
Сам запрос создается с помощью метода Полученный ответ пересылается как вывод компонента feed reader, готовый к использованию в любом месте. Получение CSV-фида Получение CSV-фида аналогично получению Atom-фида Place Statistics. Единственная практическая разница состоит в обработке результатов запроса. Как и в предыдущем случае, необходимо задать cookie-файлы для обработки объекта RequestOptions и последующей отсылки запроса На этот раз мы получаем возвращенный CSV-фид в форме фида InputStream, который необходимо прочесть. Хороший вариант - использование компонента BufferedReader для побитового чтения данных из фида. Каждый прочитанный нами бит добавляется к объекту StringBuffer - до тех пор, пока есть что читать. После этого можно возвратить StringBuffer из retriever в качестве выходных данных. Вывод в необходимом форматеТеперь, когда у нас есть данные Place Statistics в формате Atom или CSV, необходимо сформировать выходные данные, которые посылаются вызывающей стороне нашего сервлета в запрошенной форме. Ради аккуратности и гибкости можно для обработки каждого выходного формата использовать отдельный класс, который обладал бы функциональностью, описанной в Таблице 1. Таблица 1. Функции класса для вывода статистических данных
Поскольку операции этих классов аналогичны, можно создать интерфейс, определив в нем контракт, который будут реализовывать все наши классы. Пример интерфейса BaseFeedHandler показан в листинге 3. Листинг 3. Интерфейс BaseFeedHandler
Тип фида, поступающего в метод handleStatsFeed, зависит от требуемого типа выходного фида. Например, если мы обрабатываем Atom-фид, то вышеупомянутый фид имеет тип Abdera; если мы обрабатываем CSV-фид, то фид имеет тип StringBuffer. AtomFeedHandler AtomFeedHandler выводит фид Place Statistics в формате Atom. Нам достаточно взять Atom-фид, полученный от сервиса \adminqcs, и передать его наружу с помощью ответа для сервлета. JSONFeedHandler JSONFeedHandler выводит фид Place Statistics в формате JSON и требует немного большего объема работы. Функция handleStatsFeed ожидает поступление Atom-фида, порожденного сервисом adminqcs. Handler выводит JSON-структуру, которая позволяет описать фид статистических данных для места; например:
Первая часть фида содержит идентификатор (ID) фида, начальную и конечную даты фида, а также заголовок фида. Затем следует массив элементов, каждый элемент которого соответствует одному элементу Каждый элемент содержит дату публикации, заголовок и последующий массив. Этот массив содержит статистическую информацию для места, при этом каждый его элемент имеет ключ и значение. Ключ идентифицирует компонент статистических данных (пример: document_size), а значение, соответственно, указывает на значение этого компонента. Мы используем для разбора Atom-фида приложение Abdera, поскольку Abdera предоставляет все необходимое для разбора DOM - непосредственного или с помощью Xpath-запросов. В процессе разбора мы можем создать свою JSON-структуру с помощью API-интерфейсов WebSphere Portal. Эти интерфейсы обрабатывают любые проблемы со специальными символами и кодированием, сокращая перечень поводов для беспокойства. В Приложении 1 показан стандартный Atom-фид для статистики места. Abdera существенно упрощает разбор этого фида в формат JSON. Сначала осуществляется получение списка записей в Atom-фиде, затем в этих записях ищется элемент Создается экземпляр класса JSONHandler, и несколько методов этого экземпляра используются для создания JSON-структуры. Подробные сведения об этих методах предоставлены в таблице 2. Таблица 2. Методы JSON-обработки, предоставляемые классом JSONHandler
Создание фидов исключений Иногда происходят ошибки, и пользователю необходимо знать об этом. Каждый из обработчиков FeedHandler должен быть в состоянии отослать подробности произошедших исключений в соответствующем формате. Например, Atom FeedHandler отсылает Atom-документ, содержащий подробности ошибки, JSON FeedHandler отсылает JSON-документ и т. д. Если мы не сделаем этого, то JSON-обработчик вызова xhrGet, используемого для получения фида Place Statistics, может обнаружить, что он передает обратно отчет об исключениях Atom, с которым он не знает, что делать. AtomFeedHandler использует Abdera для создания Atom-фида, содержащего подробности исключения. Экземпляр класса FOMFactory используется для генерации нового фида с подробностями исключения, добавляемого в этот экземпляр. Затем все это отсылается обратно вызывающей стороне. В примере в следующем листинге показана генерация Atom-фида для исключения. Листинг 4. Пример программного кода, генерирующего Atom-фид для исключения
Выходная информация JSONFeedHandler об исключении представлена в формате JSON. Объекты API-интерфейса WebSphere Portal, использовавшиеся для формирования JSON-вывода, который мы уже видели раньше, теперь используются для формирования новой структуры. Экземпляр com.ibm.portal.streaming.json.JSONHandler используется для создания документа, к которому добавляются JSON-пары, показывающие исключение (см. листинг 5). Листинг 5. Создание JSON-фида для исключения
Защита сервлетаНе следует забывать, что сервлету нужны подробные сведения о текущем пользователе. А чтобы работать с этими сведениями, сервлет должен быть защищен. Незащищенный сервлет не способен получать доступ к подробным сведениям о текущем пользователе. Файл web.xml для сервлета содержит элемент Листинг 6. Защита сервлета в файле web.xml
Наиболее интересные части раздела Таблица 3. Ограничения безопасности
Следующий шаг состоит в связывании с ролями безопасности, имеющими доступ к данному ресурсу. Это связывание осуществляется с помощью раздела EAR-файл определяется файлом application.xml, содержащим сведения о WAR-файлах, подлежащих включению. Кроме того, в нем задаются: корень контекста приложения, например, /lotus/PA_Place_Statistics, и подробности о ролях безопасности, используемых в приложении. Файл ibm-application-bnd.xml связывает роль безопасности с соответствующими пользователями или группами; в данном случае со специальной группой All Authenticated Users. Оба эти файла содержатся в высокоуровневом каталоге META-INF в EAR-файле, который прилагается к этой статье. Теперь сервлет защищен и ему доступны сведения о текущем пользователе, вошедшем в систему. Виджет Place StatisticsС целью максимально полного использования сервлета Place Statistics необходимо предусмотреть средства для выполнения следующих действий:
Такая загрузка может быть выполнена с помощью JavaScript-виджета, разработанного с помощью библиотеки Dojo 1.3.2, которая интегрирована в тему Lotus Quickr. Этот виджет развертывается как часть EAR-файла, прилагаемого к этой статье, и помещается в следующий каталог:
Получение данных При извлечении данных для интерфейса пользователя и загружаемого CSV-файла используются разные методы. Интерфейс пользователя может использовать прямой вызов Ajax, а доступ к загружаемому файлу осуществляется с помощью тега Создание интерфейс пользователя виджета Версия виджета с интерфейсом пользователя создается в два этапа. Первый этап состоит в получении доступа к данным посредством использования Ajax-вызова к сервлету Place Statistics. На втором этапе эти данные динамически отображаются в виде простого интерфейса пользователя. Для извлечения данных используется функция Листинг 7. JavaScript-функция для получения фида статистических данных
Идентификатор места, для которого мы хотим получить статистику, хранится как атрибут виджета. Устанавливается JavaScript-объект, содержащий "контент" запроса. Этот контент состоит из идентификатора места placeId и индикатора, показывающего, что мы желаем возвращения именно JSON-структуры. После этого осуществляется запрос к сервлету Place Statistics. По мере необходимости выполняются обратные вызовы, сцепленные с обработчиками загрузки или ошибок. В случае успеха этого вызова осуществляется вызов функции Листинг 8. Пример JavaScript-кода для отображения статистики
Создание загружаемого CSV-файлаВиджет Place Statistics также предоставляет ссылку для получения всей статистики о месте в виде загружаемого файла в формате CSV. Эта ссылка формируется при открытии диалогового окна; обычная ссылка PlaceStatistics используется с параметрами, показанными в таблице 4. Таблица 4. Параметры запроса для получения загружаемого CSV-файла
Сведения о начальной и конечной дате получаются из JSON-структуры, возвращенной в качестве ответа на вызов xhrGet в функции Рендеринг виджета в виде окнаМы собираемся реализовать следующую возможность: если доступ к виджету Place Statistics осуществляется посредством ссылки, он представляется в виде окна. Этот доступ реализуется посредством оформления виджета в виде окна с последующим включением функций для отображения и свертывания виджета, представленного как окно. Сначала можно рассмотреть элементы стиля, которые определяют отображение окна. На этом шаге мы включаем в виджет охватывающий тег В листинге 9 показан фрагмент HTML-кода, иллюстрирующий требуемую разметку окна. Листинг 9. HTML-код для окна виджета
Добавление функций show/hide При нажатии на ссылку Place Statistics на экране отображается окно. Это окно должно предоставлять способ для своего закрытия. Эта задача решается с помощью функции Листинг 10. JavaScript-функция для отображения окна
Функция Функция
РазвертываниеИтак, мы создали сервлет и написали программный код для поддержки аутентификации, выходных типов и т.д. Кроме того, был написан программный код Dojo-виджета, который используется для отображения статистических сведений пользователю. Теперь необходимо развернуть этот код на сервере и добавить элементы в тему, чтобы сделать новую опцию доступной. В следующих разделах полностью описывается процесс установки, а также все изменения, которые необходимо внести в тему. Установка сервлета и виджета с помощью EAR-файла EAR-файл, прилагаемый к данной статье, содержит сервлет и Dojo-виджет, которые служат для формирования интерфейса пользователя к данным Place Statistics. Этот EAR-файл может быть установлен на сервер Lotus Quickr с помощью консоли администрирования продукта WebSphere Application Server. Установка EAR-файла помещает приложение в корень контекста /lotus/PA_Place_Statistics (заданный в файле application.xml). После того как EAR-файл будет импортирован, должно быть запущено приложение - только после этого можно будет использовать сервлет или Dojo-виджет. Посмотрите в каталог Изменение темы Теперь нам остается лишь внести в тему определенные изменения, которые позволят пользователю отображать наш виджет. Мы собираемся включить виджет в среду Lotus Quickr таким образом, чтобы к нему можно было бы обращаться с помощью ссылки на боковой навигационной панели для места (см. рис. 2). Рис. 2. Боковая навигационная панель с новой ссылкой Place Statistics Необходимо выполнить следующие задачи.
Оба файла, которые мы собираемся изменить, содержатся в приложении: Эти же файлы по отдельности содержатся в следующем каталоге. Прежде чем мы произведем любое из этих изменений, желательно сохранить копии этих файлов темы. Загрузка виджета в файл js.jsp В файл js.jsp необходимо внести изменения, обеспечивающие загрузку виджета Place Statistics из приложения PA_Place_Statistics. Файл js.jsp имеет следующее местонахождение: Сначала необходимо зарегистрировать путь к модулю, чтобы библиотека Dojo знала, где получить инструмент для просмотра статистики. В файле js.jsp уже есть несколько операторов dojo.registerModulePath, поэтому под этими операторами можно добавить следующую строку: Затем в файл js.jsp необходимо добавить строку Следует отметить, что после помещения этой ссылки в JSP-файл для корректной работы этой темы на сервере должно быть запущено приложение /lotus/PA_Place_Statistics. Обновите файл sideNav.jspf для получения доступа к виджету Теперь рассмотрим внесение в файл sideNav.jspf темы изменений, содержащих ссылку для запуска окна PlaceStatistics. Этот файл имеет следующее местонахождение: Необходимы два основных изменения:
Учебный файл sideNav.jspf, прилагаемый к данной статье, содержит примеры соответствующего кода; эти разделы отмечены комментариями, содержащими текст "PLACESTATS". Вам следует скопировать эти фрагменты и вставить их в свою копию файла sideNav.jspf, а не заменять копию это файла на вашем сервере файлом из этой статье. Новая функция для отображения виджета помещается в нижней части скрипта. В эту функцию необходимо передать идентификатор placeId, корень контекста темы и корень ресурса темы, чтобы эти сведения могли быть отосланы в виджет. Разметка для вывода ссылки в интерфейсе пользователя должна содержать следующее условие: переменная isApplicationManager имеет значение "true". Тогда ссылка будет отображаться только в случае, если текущий пользователь является менеджером. Кроме того, необходим определенный программный код для получения корня контекста темы и корня ресурса темы. Эта задача решается с помощью кода, показанного в листинге 11. Листинг 11. JSP-компонент для демонстрации ссылки Place Statistics в теме Lotus Quickr
Ссылка для доступа к виджету задается элементом И, наконец, чтобы изменения темы вступили в силу, необходимо изменить метку даты в файле Default.jsp. Этот файл имеет следующее местонахождение: Один из способов изменения метки времени - открыть файл в текстовом редакторе, внести необходимые изменения и сохранить файл. Как это все будет выглядеть После внесения всех описанных изменений, новая ссылка отображается под левым навигационным меню (см. рис. 3). Рис. 3. Левая навигационная панель с добавленной ссылкой Place Statistics Нажатие на ссылку Place Statistics приведет к появлению окна, показанного на рис. 4. Рис. 4. Статистические данные места, показанные в Web-интерфейсе пользователя для менеджеров места Нажатие на ссылку Download Statistics в нижней части приведет к отображению обычного окна загрузки браузера. По умолчанию загружаемому файлу будет дано имя placestatistics.csv. Этот файл можно сохранить или открыть с помощью любой программы, способной читать CSV-файлы, например, IBM Lotus Symphony™. Использование загруженных статистических сведений Теперь, когда владельцы мест имеют механизм для загрузки статистики о своих местах, их будет интересовать вопрос, какие статистические данные им доступны и какие отчеты можно создать. Владельцы мест могут получить следующие статистические данные уровня места.
На рис. 5 показан пример загруженной статистики для места в формате CSV. Рис. 5. Пример статистических сведений в формате CSV
Загруженный CSV-файл можно открыть с помощью электронной таблицы (Lotus Symphony, Microsoft Excel или какого-либо другого приложения для работы с электронными таблицами), а затем создавать на основе содержащихся в нем статистических данных диаграммы. На рис. 6 и 7 представлены две таблицы, составленные на основе данных "Общее количество элементов контента" и "Общий объем элементов контента (КБ)" с помощью электронных таблиц Lotus Symphony. Рис. 6. Пример графика, демонстрирующего количество элементов контента для места Рис. 7. График, демонстрирующий общий объем элементов контента CSV-файл, содержащий статистические данные для этих графиков, включен в Приложение 2 данного документа. Заключение В статье демонстрируется использование сервисов Place Statistics, поддерживаемых продуктом Lotus Quickr 8.5, для формирования пользовательского интерфейса, отображающего данные, и для реализации возможности экспорта статистических данных в другие приложения. Было продемонстрировано создание фидов в различных форматах с помощью Abdera и API-интерфейса WebSphere Portal, а также представлен программный код для чтения этих фидов. Кроме того, данная статья может служить вводным материалом по включению Dojo-виджетов в тему Lotus Quickr 8.5. Методика построения окна Dojo и его связывания с экземпляром темы может быть использована во многих других ситуациях. Приложение 1. Пример Atom-фида
Приложение 2. CSV-файл для диаграмм
|