К основному контенту

XPages. Диалог с пользователем. dGrowl уведомления. Часть 2

В первой части, посвященной dGrowl сообщениям, рассмотрели как подключать и вызвать dGrowl-уведомления из клиентского скрипта. Сегодня рассмотрим, как это сделать со стороны сервера, например из Java-кода.

Техническая подоснова поста взята отсюда.

Для того, чтобы добиться желаемого нужно:
1. Нам нужно передать некоторый JavaScript код для его выполнения в клиент (браузер) для его последующего выполнения в рамках этой страницы, например, по завершению ее частичного обновления. Для этого в классе UIViewRootEx есть метод postScipt(). Сам класс, если я правильно понимаю (нет - поправьте), представляет собой (описывает) корневой элемент страницы (xPage). Получить объект класса UIViewRootEx можно взяв значение переменной view и приведя его к соотв. типу:
UIViewRootEx2 view = (UIViewRootEx2)ExtLibUtil.resolveVariable(FacesContext.getCurrentInstance(), "view");

2. Сгенерировать сам скрипт для отправки в клиент. Тут единственный момент - правильная генерация кода со всеми кавычками и пр.
Для генерации скрипта можно использовать, например, вот такой код:
StringBuilder result = new StringBuilder();
result.append("dg.addNotification(");
if (! StringUtil.IsEmpty(detail))
 JSUtil.addString(result, detail);
result.append(",{'channel':");
JSUtil.addString(result, messageType.getDGrowlChannel());
if (! StringUtil.IsEmpty(summary)) {
 result.append(", 'title':");
 JSUtil.addString(result, summary);
}
if (duration.intValue() == 0)
 result.append(", 'sticky':true");
else
 result.append(", 'duration':" + duration);
result.append("});");

, где JSUtil (com.ibm.xsp.util.JSUtil) позволит добавить строковые значения в скрипт корректным образом - не нужно будет думать о соответствующих кавычках.

В моем код (в предыдущих статьях родился класс MessageBean, отвечающий за отправку и обработку сообщений) это все переросло в следующие Java-методы:
/**
 *
 * @param messageType
 * @param summary
 * @param duration if == 0 then - isSticky
 */
public static void popupMessage(final Message.MessageType messageType, final String summary, final String detail, final Number duration) {
 StringBuilder result = new StringBuilder();
 result.append("dg.addNotification(");
 if (! StringUtil.IsEmpty(detail))
  JSUtil.addString(result, detail);
 result.append(",{'channel':");
 JSUtil.addString(result, messageType.getDGrowlChannel());
 if (! StringUtil.IsEmpty(summary)) {
  result.append(", 'title':");
  JSUtil.addString(result, summary);
 }
 if (duration.intValue() == 0)
  result.append(", 'sticky':true");
 else
  result.append(", 'duration':" + duration);
 result.append("});");
 
 getViewRoot().postScript(result.toString());
}

public static UIViewRootEx2 getViewRoot() {
 return (UIViewRootEx2)ExtLibUtil.resolveVariable(FacesContext.getCurrentInstance(), "view");
}

Вызов на странице (уже серверным JavaScript) будет выглядеть как:
MessageBean.popupMessage(Message.MessageType, String TITLE, String TEXT, Number DURATION);
Пример вызова и использования как всегда можно посмотреть в Demo-приложении.

Если вам понравился пост, жмите +1, делитесь в соц. сетях и форумах! Комментируйте, обсуждайте! #xPages-по-русски

Комментарии

Популярные сообщения из этого блога

Занимательные алгоритмы. Поиск цикла в односвязном списке

И снова про тараканов, которые иногда возникают в голове. Как-то раз, засыпая, я задумался на курьезными задачками из своей сферы деятельности (Lotus Notes), которые можно было бы задать на собеседовании, плавно перешел к воспоминаниям о своих первых собеседования, когда опыта работы еще не было. Опыт самих собеседований у меня не велик а места, где задавались действительно интересные задачи (а не задачки типа: написать сортировку массива любым известным способом) вообще равны одному - это ABBYY. Как минимум одна задачка в списке на знание и понимание классических алгоритмов, описанных в книге Дональда Кнута -  Искусство программирования .

Unit-testing object validation when validator has DI

Summary Unit test object validation when validator(s) has a dependency. For instance, we have some custom field and cross-field validators. Want to test their combination. Additionally some of validators have dependencies, injected through constructor or setters. You're not using property injection, right? Shortcut If you are just searching for an answer, here's the fast way: Declare CustomConstraintValidatorFactory that implements javax.validation.ConstraintValidatorFactory Override getInstance method and on facing your constraint validator class instantiate it Otherwise delegate validator construction to org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorFactoryImpl Build validator factory and provide it your CustomConstraintValidatorFactory Build validator, using that factory... Go to demo project on GitHub for details:  https://github.com/MrArtemAA/blog-demos/blob/master/test-validator-with-injection/src/test/java/ru/artemaa/d

Lotus Notes FAQ. 8/9 Eclipse. Как настроить уведомления о Sametime сообщениях

Н а написание данной "инструкцию" натолкнул мой коллега. Помню, первый раз сам долго искал, как отключить постоянно выпрыгивающие уведомления о новых сообщениях в Sametime. И так, речь идет о клиентах IBM Notes 8+ версии Standart (Eclipse based). Как настроить уведомления о Sametime сообщениях?