среда, 22 сентября 2010 г.

Блог переехал!!!

Уважаемые читатели, мой блог переехал по адресу: http://www.bpmylife.ru
В данный блог информацию я выкладывать больше не буду, читайте теперь на новом ресурсе.

С уважением, Евгений Попов

четверг, 9 сентября 2010 г.

Дамп базы Intalio

Забыл сказать, что базу Intalio надо дампить с ключом max_allowed_packet, иначе при достижении определенного объема будет дампиться не вся база
mysqldump --max_allowed_packet=500M

Эту статью Вы можете прочитать на новом блоге 

пятница, 23 июля 2010 г.

SugarCRM... начало!

Немного отвлекусь от BPMS. В скором времени набросаю пару статей по SugarCRM и Talend'у. У нас появилась необходимость перехода с одной CRM на SugarCRM.
Выбор пал на SugarCRM по следующим причинам:
- OpenSource;
- "дружит" с SOAP (в коробке уже есть веб-сервис);
- является весьма масштабируемой, также на sugarforge выложено большое количество модулей, как для разработчиков, так и готовых решений;
- модульная конструкция. Впечатление, что она пластилиновая...;
- распространенность в рамках OSS;
- легко подается кастомизации;

В sugarCRM есть конечно подводные камни, но их найти достаточно просто, т.к. написана она на PHP + javascript.

Для перегона базы использовал Talend.

Эту статью Вы можете прочитать на новом блоге 

среда, 14 июля 2010 г.

Edit Shugar Dashlet по-умолчанию не работает

Занялся настройкой SugarCRM, и был несколько "сконфужен" тем, что не работает редактор Dashlet'ов. А без него настроить панели можно только "накодив". Решение нашлось на: http://www.sugarcrm.com/forums/showthread.php?t=55757.

В файл [SugarCRM]/include/generic/SugarWidgets/SugarWidgetFieldvarchar.php достаточно добавить следующий код, и редактор включиться:

function
SugarWidgetFieldVarchar(&$layout_manager)
{
parent::SugarWidgetReportField($layout_manager);


Эту статью Вы можете прочитать на новом блоге 

среда, 9 июня 2010 г.

Удаление задач (PA - People Activity) после завершения процесса

Если вы еще не сталкивались со сложностью удаления активных форм (People Activity), то у Вас все еще впереди. По-умолчанию, если Ваш процесс завершается, то существующие активные формы не завершаются, а остаяются "висеть". Для операции удаления "подвисших" задач требуются некоторые пляски с бубном, которые я и собираюсь описать в данной статье.

Для удаления задач на понадобятся следующие сервисы (расположены в порядке использования):

1. TaskManagementService.wsdl

В данном сервисе нам понадобиться операция GetAvailableTasks. На самом деле очен интересная операция, если бы не www.github.com то я бы долго искал нужные параметры к этой операции.

Теперь подробнее о самой операции, а точне о ее параметрах:
- participantToken - идентификатор пользователя, из под которого мы будем запускать search задач, соответственно нужно, чтобы у этого пользователя был доступ к удаляемой форме.
- taskType - для нашего случа нужно использовать "PATask" - это People Activity task. Можно еще использовать PIPATask или Tasks. Но тогда буду другими и запросы, т.к. данные на выходе будут отличаться.
- subQuery - "T._state = TaskState.READY and T._instanceId='" в instanceId подставляем PID ($ode:pid) процесса из которого удаляем задачи. Т.е. строка будет выглядеть примерно так: "T._state = TaskState.READY and T._instanceId='3321'", где 3321 - PID процесса с задачами, которые надо удалить
- first - первая выводимая задача начальная задача
- max - максимальное выводимое число задач

2. InstanceManagement.wsdl
Операция delete:
- filter - "iid=3321", где 3321 - PID процесса с задачами, которые надо удалить

Операцией delete мы удаляем запущенный Instance процесса из ODE

3. CompleteTask.wsdl
Операция SkipTask:
- taskId - id задачи, берем из массива возвращенного операцией GetAvailableTasks. (Например: $tnsGetAvailableTasksResponseMsg.GetAvailableTasksResponse->task[*]->taskId
- participantToken - идентификатор пользователя

Операцие SkipTask мы "пропускаем" задачу и тем самым удаляем ее из Tempo

Через пару дней ыложу проект с примером.

Эту статью Вы можете прочитать на новом блоге

Настройка JasperServer на работу с Active Directory

Пришло время настроить авторизацию в JasperServer через ActiveDirectory. Для этого необходимо поднастроить конфиги и скачать spring-ldap-1.3.0.RELEASE-all.jar

Скачанный spring-ldap-1.3.0.RELEASE-all.jar нужно скопировать в [JaperServer folder]/apache-tomcat/webapps/jasperserver/WEB-INF/lib

Теперь надо подправить конфиг для использования LDAP. Файл с настройками называется applicationContext-security.xml. Ниже приведен пример настройки на LDAP. В файле applicationContext-security.xml надо найти строку ====AUTHENTICATION==== оттуда начинаются правки. Строки с настройками для LDAP выделены красным цветом

<!-- ======================== AUTHENTICATION ======================= -->
<bean id="authenticationManager" class="org.springframework.security.providers.ProviderManager">
<property name="providers">
<list>
<!-- not on by default-->
<ref local="ldapAuthenticationProvider"/>
<ref bean="${bean.daoAuthenticationProvider}"/>
<ref local="anonymousAuthenticationProvider"/>
<!--ref local="jaasAuthenticationProvider"/-->
</list>
</property>
</bean>

<bean id="daoAuthenticationProvider" class="org.springframework.security.providers.dao.DaoAuthenticationProvider">
<!-- jdbcDaoImpl -->
<!-- <property name="userDetailsService"><ref bean="inMemoryDaoImpl"/></property> -->
<property name="userDetailsService"><ref bean="${bean.internalUserAuthorityService}"/></property>
<property name="passwordEncoder"><ref local="passwordEncoder"/></property>
</bean>

<bean id="passwordEncoder" class="com.jaspersoft.jasperserver.api.metadata.common.service.impl.PasswordCipherer" lazy-init="false">
<property name="allowEncoding"><value>true</value></property>
<property name="keyInPlainText"><value>false</value></property>
<property name="secretKey"><value>0xC8 0x43 0x29 0x49 0xAE 0x25 0x2F 0xA1 0xC1 0xF2 0xC8 0xD9 0x31 0x01 0x2C 0x52 0x54 0x0B 0x5E 0xEA 0x9E 0x37 0xA8 0x61</value></property>
<property name="secretKeyAlgorithm"><value>DESede</value></property>
<property name="cipherTransformation"><value>DESede/CBC/PKCS5Padding</value></property>
</bean>

<bean id="anonymousProcessingFilter" class="org.springframework.security.providers.anonymous.AnonymousProcessingFilter">
<property name="key"><value>foobar</value></property>
<property name="userAttribute"><value>anonymousUser,ROLE_ANONYMOUS</value></property>
</bean>

<bean id="anonymousAuthenticationProvider" class="org.springframework.security.providers.anonymous.AnonymousAuthenticationProvider">
<property name="key"><value>foobar</value></property>
</bean>

<bean id="initialDirContextFactory" class="org.springframework.security.ldap.DefaultInitialDirContextFactory">
<!--Путь к пользователям (верхний уровень) -->
<constructor-arg value="ldap://inside.lavtech.ru:389/OU=OU,OU=Lavtech,DC=inside,DC=lavtech,DC=ru"/>

<!-- You may not need the next propertiesD-->
<!--Путь к менеджеру контроллера домена (для поиска пользователей) -->
<property name="managerDn"><value>CN=adtest,CN=Users,DC=inside,DC=lavtech,DC=ru</value></property>
<!--пароль менеджера контроллера домена -->
<property name="managerPassword"><value>123456</value></property>
</bean>

<bean id="userSearch"
class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
<constructor-arg index="0">
<value></value>
</constructor-arg>
<constructor-arg index="1">
<!--Логин берем из аттрибута sAMAccountName -->
<value>(sAMAccountName={0})</value>
</constructor-arg>
<constructor-arg index="2">
<ref local="initialDirContextFactory" />
</constructor-arg>
<!-- Поиск в подуровнях-->
<property name="searchSubtree">
<value>true</value>
</property>
</bean>

<!--
For LDAP authentication
-->

<bean id="ldapAuthenticationProvider" class="org.springframework.security.providers.ldap.LdapAuthenticationProvider">
<constructor-arg>
<bean class="org.springframework.security.providers.ldap.authenticator.BindAuthenticator">
<constructor-arg><ref local="initialDirContextFactory"/></constructor-arg>
<!-- авторизуемся по этому аттрибуту-->
<property name="userDnPatterns"><list><value>sAMAccountName={0}</value></list></property>
<property name="userSearch" ref="userSearch"/>
</bean>
</constructor-arg>
<constructor-arg>
<!-- разобраться с ролями (возможно есть верятность, что можно использовать роли из ActiveDirectory)-->
<bean class="org.springframework.security.ldap.populator.DefaultLdapAuthoritiesPopulator">
<constructor-arg index="0"><ref local="initialDirContextFactory"/></constructor-arg>
<constructor-arg index="1"><value></value></constructor-arg>
<property name="groupRoleAttribute"><value>cn</value></property>
<!--property name="groupSearchFilter"><value>(&(uniqueMember={0})(objectclass=groupofuniquenames))</value></property-->
<property name="searchSubtree"><value>true</value></property>
</bean>
</constructor-arg>
</bean>

Теперь можно авторизовываться через ActiveDirectory


Эту статью Вы можете прочитать на новом блоге 

Русские шрифты при генерации PDF в JasperReport

Пришло время создавать отчетность по протекающим бизнес-процессам в Intalio. Для этих целей было принято решение использовать JasperReport. Одно из самых основных наших требований при выборе системы отчетности было: Open Source, SOAP. Набросать отчет не составило труда, но хотелось бы еще его импортировать в PDF. С этим появились трудности, т.к. русских шрифтов в пакете нету.

Покопавшись пару часов разобрался как подключить шрифты и к iReport и к JasperServer.
Требуется настройка как iReport так и JasperServer.

Подключение шрифтов к iReport

1 Копируем нужные нам шрифты например в папку c:\Fonts
2 Включаем папку c:\Fonts в CLASSPATH iReport'а (см. рисунок ниже)

2.1 Выбираем Меню Tools->Options
2.2 Выбираем вкладку CLASSPATH
2.3 Добавляем папку - кнопка Add Folder
3 Теперь надо перейти на вкладку Fonts (см. рисунок ниже)
3.1 Для того чтобы мы могли использовать шрифты из подключенной папки надо поставить галочку напротив c:\Fonts в окне PDF fonts path (Deprecated, Install True Type fonts instead)
4 Вуаля! Теперь можно использовать русские шрифты в iReport (данные шрифты будут доступны для свойства PDF Font name is now deprecated. You should use a Font Extension when using a not standart font. См. рисунок ниже)

Настройка JasperServer для работы с русскими шрифтами
Как ни странно тут все очень просто. Необходимо скопировать шрифты из папки c:\Fonts в [JasperServer folder]/apache-tomcat/webapps/jasperserver/WEB-INF/classes

Для успокоения души можно перезагрузить JasperServer.
Теперь можно использовать русские шрифты.

Ссылки на другие инструкции по подключению шрифтов:
http://mdahlman.wordpress.com/2009/05/13/fonts-in-jasperserver/
http://mdahlman.wordpress.com/2010/04/16/fonts-in-jasperserver-3-7/

Эту статью Вы можете прочитать на новом блоге 

среда, 21 апреля 2010 г.

Использование сервисов и форм на загружаемых пулах.


Так выглядит загружаемый пул с пользовательской формой инициирующей процесс и сервисом, который получает данный от LDAP

Для тех, кто занимался моделирование процессов в Intalio|Designer до выхода 6-ой версии зачастую сталкивались с тем что в определенный момент из за большого количества сообщений от сервисов и форм делали диаграмму сложно читаемой. Начиная с 6-ой версии это неудобство было решено, теперь использовать загружаемый (executable) пул использовать для работы с формами и операциями сервисов. Таким образом можно больше не пользоваться незагружаемыми пулами (ну или почти неиспользовать).

Эту статью Вы можете прочитать на новом блоге 

пятница, 9 апреля 2010 г.

WEB-cервис для DotProject

В свое время мы выбирали систему проджект менеджмента. Остановились на DotProject, т.к. во-первых он OpenSource, а во-вторых он WebBased. Также он хорошо цепляется к LDAP, а это соответственно позволяет его "прицепить" и к Active Directory. Это все лирика, немного подробнее описшу сей продукт в следующий раз, т.к. информации по нему в сети полно.

Самое вкусное, это то - что мы написали WEB-сервис под него, т.к. для нашей интеграции нужна была система проджект менеджмента. Соответственно с его помощью можно фактический управлять DotProject.

Сервис скачать можно отсюда:
- http://github.com/EvgenyPopov/DotProject-SOAP

Официальный сайт: http://dotproject.net/

Эту статью Вы можете прочитать на новом блоге 

среда, 31 марта 2010 г.

У RBACQueryService не работает часть функционала

Начал было радоваться, что Intalio настроил на Microsoft Active Directory как тут появились новые "грабли". Дело в том, что RBACQueryService, который идет вместе с security-ws-service даже после обновления не работает как надо.

Суть проблемы в следующем (авторизация в UI-FW проходит без проблем):

Если нам надо получить аттрибуты пользователя с помощью операции RBACQueryService->GetUserProperties, то мы можем получить доступ непосредственно только к пользователям, которые находятся в security.ldap.user.base=ou=Users, а пользователи допустим находящиеся в ou=Users1,ou=Users видны для операции GetUserProperties уже не будут.



На данный момент ищу решение проблемы, как найду - обязательно выложу.

Эту статью Вы можете прочитать на новом блоге