JEXL
JEXL - язык коротких выражений.
Используется для написания в конфигурации макросов условных выражений, гибкого вычисления небольших строк. Помимо операторов, описание которых доступно по ссылке в конце раздела, язык поддерживает обращение к функциям Java - объектов, переданных на вход обработчика в зависимости от условий.
Для вызова функции Java объекта необходимо ввести название объекта в контексте, точку и непосредственно вызов функции. Для вызова статического метода класса указывается имя класса с точкой.
Пример использования выражения:
processCreateLink.1.title=Проект (Уфа) processCreateLink.1.processTypeId=9260 processCreateLink.1.linkType=processDepend processCreateLink.1.checkExpression=1 =~ processParam.addressCityIds( 90 ) and process.getStatusId() == 39 processCreateLink.1.copyParams=90,89,238 processCreateLink.1.copyLinks=1
В данном случае создание связанного процесса будет доступно только для процессов в статусе с кодом 39 и с наличием адреса в параметре с кодом 90 с городом 1.
В JEXL процессор всегда передаются объекты:
- u - статический контекст объекта ru.bgcrm.util.Utils - возможность вызова статических функций;
- tu - статический контекст объекта ru.bgcrm.util.TimeUtils - возможность вызова статических функций;
- su - статический контекст объекта org.apache.commons.lang.StringUtils - возможность вызова статических функций;
- сu - статический контекст объекта org.apache.commons.collections.CollectionUtils - возможность вызова статических функций;
- NEW_LINE - перенос строки;
- NEW_LINE2 - два переноса строки.
Дополнительные объекты передаются в зависимости от места использования.
При необходимости выражения могут быть многострочными, при этом результат (если он есть) возвращается оператором return. Пример многострочного скрипта для простого обработчика событий процесса:
onProcessEvent.2.doExpression=<<END dao = new("ru.bgcrm.dao.ParamValueDAO", conSet.getConnection()); dao.updateParamText(process.getId(), 63, "тест"); END
Часто необходимая информация (детальное описание - по ссылкам далее):
- оператор [] - создание массива, {} - HashSet, подойдёт на место Collection;
- функция new (см. пример выше) - создание объекта класса, конструктор может быть с параметрами;
- операторы проверки наличия объектов в коллекциях: =~ , !~
Методы вызываются у объектов классов с помощью точки, для вызова статического метода используется объект типа java.lang.Class нужного класса, который может быть создан просто записью полного имени класса. Небольшой пример, как вызывать статические методы ru.bgcrm.util.Utils.
u = ru.bgcrm.util.Utils; v = u.parseInt(3);
Подробная спецификация по языку:
http://commons.apache.org/jexl/reference/syntax.html#Functions
- https://commons.apache.org/proper/commons-jexl/apidocs/org/apache/commons/jexl3/package-summary.html
Обратите внимание на вызов функции u.escapeXml - она преобразует все символы HTML разметки в спецпоследовательности. Если не использовать эту функцию для генерации HTML, возможны проблемы, в случае появления в описании процесса символов <,> либо кавычек. Пример:
processReference.1.stringExpression=u.escapeXml( u.maskNull( u.getFirst( processParam.addressValues( 345, 'fromStreet' ) ) ) ) + " (" + size( processParam.addressValues( 345 ) ) + ")"
Java REGEXP
Регулярные выражения позволяют гибко описывать шаблоны строк.
Описание строк осуществляется путём подстановки определённых макросов, обозначающих части строки либо символы определённого типа.
Например:
- (342) - это символы 342 следующие один за другим;
- 3\d2 - это 3 затем любая цифра и 2;
- ((342)|(559)) - последовательность симоволов 342 либо 559;
- 44[2-8] - строки 442, 443, 444, 445, 446, 447, 448.
Расшифровка некоторых макросов:
- а-b - на этом месте может располагаться симовол от a до b (в таблице символов);
- [abc] - на этом месте может располагаться любой из символов a, b либо c;
- abc - последовательное расположение символов a, b, c;
- ((abc)|(def)) - на этом месте последовательно располагаются abc либо def, () - группа символов.
Ссылки:
http://www.opennet.ru/docs/RUS/perlre_man/ - регулярные выражения Perl, практически идентичны Java.
http://j2w.blogspot.com/2008/01/java.html - регулярные выражения Java.
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/regex/Pattern.html - спецификация на английском.
Log4j
Log4j - библиотека логирования для Java. Настройка логирования производится в файле log4j.properties, изменение файла можно производить при работающем приложении. Вид файла при установке системы:
log4j.rootLogger=INFO, file log4j.logger.ru.bgcrm=INFO, file log4j.additivity.ru.bgcrm=false log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{MM-dd/HH:mm:ss} %5p [%t] %c{1} - %m%n log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{MM-dd/HH:mm:ss} %5p [%t] %c{1} - %m%n log4j.appender.file.File=./log/bgcrm.log log4j.appender.file.Append=true log4j.appender.file.BufferedIO=false log4j.appender.file.BufferSize=1024 log4j.appender.file.MaxBackupIndex=5 log4j.appender.file.MaxFileSize=10MB
Сообщения в логе разделяются на уровни (в порядке возрастания): DEBUG, INFO, WARN, ERROR, FATAL. По-умолчанию настроен уровень INFO, т.е. выводятся информационные и ошибочные сообщения (INFO, FATAL, ERROR), отладка не выводится. Вывод осуществляется в файл log/bgcrm.log, который обрезается на размере 10МБ с созданием отдельных файлов.
Для включения вывода отладочной информации необходимо установить:
log4j.logger.ru.bgcrm=DEBUG, file
В конфигурационном файле возможно изменять формат информации в файле, фильтр по классам и другие параметры логирования.
Ссылки:
http://artamonov.ru/2007/04/06/vvedenie-v-log4j/ - вводная статья на русском.
XSLT 2.0
Устаревшая технология
Использование XSLT более не развивается в продукте. Первоначально использовалась для генерации документов в плагине Document, но в новых версиях вместо XSLT могут использоваться JSP шаблоны.
XSLT - язык, основанный на формате XML. Его назначение - трансформация XML дерева с данными в какой-либо результирующий формат. Например: TXT, XHTML (HTML документ, соответсвующий правилам формата XML). Трансформация производится XSLT процессором.
Версия 2.0 является существенным расширением версии 1.0, ключевые изменения можно посмотреть здесь: http://www.xmlhack.ru/texts/02/xslt20/xslt20.html
В XSLT шаблоне различаются просто теги, которые без изменений перейдут в результирующий документ и управляющие теги для процессора с префиксом xslt. Пример фрагмента XSLT документа:
<tbody> <xsl:for-each select="bills/bill"> <xsl:variable name="uid" select="@uid"/> <tr> <td nowrap="nowrap"><xsl:value-of select="@number"/></td> <td><xsl:value-of select="@create_dt"/></td> <td><xsl:value-of select="@pay_dt"/></td> <td nowrap="nowrap"><xsl:value-of select="@summ"/></td> <td nowrap="nowrap"> <xsl:choose> <xsl:when test="@status=0">не оплачен</xsl:when> <xsl:otherwise>оплачен</xsl:otherwise> </xsl:choose> </td> <td> <xsl:choose> <xsl:when test="$uid=-1">создан Вами</xsl:when> <xsl:otherwise>создан администратором</xsl:otherwise> </xsl:choose> < /td>
Здесь форматируется XHTML документ, при этом используются стандартые HTML теги (tr, td) и управляющие теги поцессора (xsl:choose, xsl:value-of). Рассмотрим несколько XSLT директив, встречающихся в приведенном фрагменте: <xsl:for-each select="bills/bill"> - для каждого узла bills/bill исходного дерева XML данных выполнить то что указано до </xsl:for-each>
<xsl:variable name="uid" select="@uid"/> - создать переменную uid и присвоить ей значение из атрибута uid текущего узла bill
<xsl:value-of select="@number"/> - вставить значение атрибута number текущего элемента bill
<xsl:choose> - условный оператор, аналог case либо if-else, внутри могу быть несколько <xsl:when> условий и действие по умолчанию <xsl:otherwise> Ниже приведены ссылки на руководства по XSLT. Язык разметки XSLT тесно завязан с языком XPath - языком выборки данных в XML деревьях. XSLT процессор "Saxon HE" используемый в BGCRM поддерживает спецификации XSLT и XPath версий 2.0 и 2.0.
http://ru.wikipedia.org/wiki/XSLT - статья в Wikipedia
http://www.xmlhack.ru/texts/02/xslt20/xslt20.html - отличия XSLT 2.0 от 1.0 версии
http://www.xmlhack.ru/texts/02/xpath20/xpath20.html - отличия XPath 2.0 от 1.0 вервсии
http://www.saxonica.com/documentation/functions/intro.xml - реализованные в процессере Saxon функции XSLT
http://www.w3.org/TR/xslt20/ - XSLT 2.0 спецификация
http://www.w3.org/TR/xpath20/ - XPath 2.0 спецификация
http://www.w3.org/TR/xpath-datamodel/ - модель данных XPath