barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

среда, 6 апреля 2016 г.

Birt: объединение по вертикали ячеек таблицы

Задача

Есть таблица с данными, сгруппированными по определенному полю. Причем в рамках группы значения ячеек нескольких колонок одинаковы. В итоге таблица выглядит примерно следующим образом:
Необходимо ячейки первых двух колонок, входящие в одну группу (и содержащие одинаковые значения) объединить по вертикали.

Решение

Решение вышло несколько нетривиальным. Birt умеет убирать дублирующиеся значения к ячейках колонки (путем установки свойства "Suppress duplicates"), но он при этом не объединяет ячейки, а просто делает все ячейки под первой ячейкой с определенным значением пустыми. Это решение не подходит для случая, когда значения ячеек длинные, т.к. тогда первая строка растягивается по высоте, чего не произошло бы, будь ячейки объединены:
В итоге пришлось задействовать скрипты:
  1. На загловочную строку группы вешаем обработчик onCreate со следующим содержимым:
    reportContext.setGlobalVariable("GROUP_ROW_CNT", 0);
    Т.е. мы устанавливаем глобальную переменную GROUP_ROW_CNT в 0. Эта переменная будет счетчиком строк в рамках группы.
  2. На ячейки первого и второго столбца также вешаем обработчик onCreate:
    var curGroupRowCnt = reportContext.getGlobalVariable("GROUP_ROW_CNT");
    curGroupRowCnt++;
    reportContext.setGlobalVariable("GROUP_ROW_CNT", curGroupRowCnt);
    if(curGroupRowCnt != 1) {
    this.getStyle().display = "none";
    } else {
    this.rowSpan = 1000; // заведомо большое число, т.к. мы на данном этапе не знаем, сколько строк в группе
    }
    Т.е. мы инкрементируем счетчик строк в группе, и далее, если строка первая - устанавливаем для нее значение rowSpan, заведомо большее, чем возможное число строк в группе, а если строка не первая - то скрываем ее.
Вуаля, получаем в точности то, что хотели:

Спасибо http://birtworld.blogspot.ru/2010/10/birt-duplicate-rows.html, подтолкнул в правильном направлении.

вторник, 5 апреля 2016 г.

Birt: отладка отчета и ошибка "Failed to initialize emitter ... Access is denied"

Проблема

Пытаюсь запустить отладку birt-отчета в Birt Report Designer 4.5, получаю ошибку в логе:
апр 05, 2016 9:34:32 PM org.eclipse.birt.report.engine.api.impl.EngineTask handleFatalExceptions
SEVERE: An error happened while running the report. Cause:
org.eclipse.birt.report.engine.api.EngineException: Failed to initialize emitter.
at org.eclipse.birt.report.engine.emitter.EmitterUtil.getOuputStream(EmitterUtil.java:82)
...
Caused by: java.io.FileNotFoundException: \Myreport.rptdesign.html (Access is denied)
at java.io.FileOutputStream.open0(Native Method)
...
Работаю в Windows 7.

Решение

Зайти в конфигурацию отладки (Run -> Debug Configurations) и сменить путь в поле "Temp folder" на существующую доступную для записи директорию. Применить изменения. 

четверг, 25 февраля 2016 г.

Maven 3.3.9 и плагины maven-invoker-plugin:1.8 / exec-maven-plugin:1.2

Проблема

При попытке сборки проекта, использующего exec-maven-plugin версии 1.2, с помощью maven версии 3.3.9 возникает ошибка:
[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.2:exec (def
ault) on project *****: Command execution failed. Cannot run program
 "mvn" (in directory "D:\***"): CreateProcess error=2, Не удается найти указанный файл ->
 [Help 1]
Аналогичная проблема с плагином maven-invoker-plugin версии 1.8 под maven 3.3.9:
[INFO] --- maven-invoker-plugin:1.8:run (default) @ **** ---
[INFO] Building: pom.xml
[INFO] ..FAILED (0.0 s)
[INFO]   Maven invocation failed. Error configuring command-line. Reason: Maven
executable not found at: C:\Program Files\apache-maven-3.3.9\bin\mvn.bat
При этом версией maven 3.0.4 проект собирался без проблем.

Решение

Поднять версию exec-maven-plugin до 1.4.0, а maven-invoker-plugin - до 2.0.0.

вторник, 16 февраля 2016 г.

WSO2 ESB: wso2-esb-sequence-plugin и заглавные буквы "И"

wso2-esb-sequence-plugin версии 2.0.х, где x>5, при сборке бьет кодировку, превращая заглавные буквы "И" в сиквенсах в кракозябры. Workaround'а, кроме отката на 2.0.4, пока не нашел.

вторник, 2 февраля 2016 г.

PostgreSQL: просмотр пользовательских типов через pgAdmin

pgAdmin умеет показывать пользовательские типы, но эта функциональность по-умолчанию почему-то выключена в настройках. Идем в Файл -> Параметры -> Браузер -> Показать, ставим галочку напротив "Типы", обновляем браузер объектов и вуаля:


понедельник, 1 февраля 2016 г.

ActiveMQ 5.7.0: отключение Dead Letter Queue для определенной очереди

Задача

Для определенной очереди (пусть это будет "MyQueue") отключить использование Dead Letter Queue.

Решение

В activemq.xml добавить <discardingDLQBrokerPlugin dropOnly="MyQueue" dropAll="false"/> в блок <plugins/>. Перезапустить ActiveMQ.
ЗЫ Важно указывать dropAll="false", т.к. по-умолчанию он установлен в true и имеет приоритет над dropOnly.