пятница, 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 уже не будут.



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

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

понедельник, 29 марта 2010 г.

Галактика вышла в массы

На днях обнаружил, что с недавнего времени ERP "Галактика" стала Open Source, закрытым осталось только ядро. Был очень удивлен, т.к. до недавнего времени данная "коробка" была полностью закрыта и стоила достаточно дорого. В отрытой версии доступно 15 лицензий (контурных или модульных - пока не знаю, покручу - расскажу). Причем доступен оченб богатый набор контуров/модулей. В скором времени выложу более подробную информацию.

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

вторник, 23 марта 2010 г.

Настройка Intalio|Server для работы с Microsoft Active Directory

Как и обещал ранее, в данной статье я расскажу как настроить Intalio|Server для работы с Microsoft Active Directory.
Хоть и на официальном сайте Intalio говориться о том, что использование Microsoft AD возможно только в Enterprise версии в это верить особо не стоит. Для настройки нам понадобиться:
1. Внести изменения в ldap.properties
2. Обновить библиотеки security

1. Изменение настроек ldap.properties
Не удивляйтесь, что изменения в данном файле-настроек будут незначительные. Ниже приведен листинг ldap.properties:


#
# Configuration for Microsoft Active Directory
#
#
# The ULR for the LDAP Server
# The default is 'ldap=://localhost:389/'.
#
java.naming.provider.url=ldap://my.active.directory:389/
#
# The user of the LDAP Server connection
# For example: 'cn=Directory Manager'.
#
java.naming.security.principal=cn=Administrator,cn=users,dc=my,dc=active,dc=directory
#
# The credentials or password of the connection
# For example: 'password'.
#
java.naming.security.credentials=password
#
# Authetication method to connect to the LDAP Server
# The default is 'simple'.
#
java.naming.security.authentication=simple
#
# The supported realm(s) for the directory. The properties
# list name of the realm, and the base DN separated by a
# colon (':')
# For example: 'airrus:dc=airrus,dc=com'.
#
security.ldap.realm.0=intalio:dc=my,dc=active,dc=directory
#
# The ldap factory for the directory service
# The default is 'com.sun.jndi.ldap.LdapCtxFactory'.
# (without quotes, same below)
#
java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory
#
# The user's sub-context
# For example: 'ou=People', if people belongs to
# 'ou=People'
#
security.ldap.user.base=ou=Users
#
# The role or group's sub-context
# For example: 'ou=Roles', if roles belongs to
# 'ou=Roles'.
#
security.ldap.role.base=ou=Groups
#
# An LDAP attribute name that identifies an user
# For example: 'uid'.
#Данный аттрибут устанавливаем sAMAccountName, т.к. он является логином, cn нам
#не совсем подходит, т.к. там может содержаться русский язык, который при авторизации
#без "напильника" не принимается
security.ldap.user.id=sAMAccountName
#
# The LDAP attribute name that identifies a role
# For example: 'cn'.
#
security.ldap.role.id=cn
#
# The LDAP attribute name that references a role's ascendants
# If this attribute is specified, leave 'security.ldap.role.descen' out
# For example, if standard Role is used for access control, specify
# 'nsRoleDN' or a corresponding attribute of the particular server,
# and leave out security.ldap.role.descen properties.
#
#security.ldap.role.ascen=nsRoleDN
#
# The LDAP attribute name that references a role's descendants or members.
# If this attribute is specified, leave security.ldap.role.ascen out.
# For example, if Group is used for access control, specify 'member'
# or a corresponding attribute of the particular server, and leave out
# security.ldap.role.ascen
#
#security.ldap.role.descen=member
#
# The LDAP attribute name of an user object that references the user's roles
# For example, 'nsRoleDN'.
#
#security.ldap.user.roles=nsRoleDN
#
# The LDAP attribute name of a role (or group) that references the role's
# users.
# For example, 'uniquemember'.
#В AD роли находятся под аттрибутом member а не uniquemember
security.ldap.role.users=member
#
# The attribute name of an user's calculated effective roles.
# If Role is used, specify 'nsRole' or a corresponding attribute
# of the particular server. For Group with Active Directory,
# specify 'memberOf'. If unsure, leaves it out
#
#security.ldap.user.allroles=nsRole
#
# The permissions' sub-context
# For example, 'ou=Permission'.
#
security.ldap.perm.base=ou=Permission
#
# The LDAP attribute name of a role that references permission objects
# For example: 'permissions'.
#
security.ldap.role.perms=permission
#
# The LDAP attribute of permission object that reference the permission's
# roles or groupsOC
# For example: 'nsRoleDN'.
#
#security.ldap.perm.roles=nsRoleDN
#
# The LDAP attribute of permission object that references the permission's
# protected resources.
# For example: 'resource'.
#
security.ldap.perm.objects=resource
#
# The LDAP attribute name that identifies a permission object
# For example, 'cn'.
#
security.ldap.perm.id=cn
#
# The LDAP attributes names of an user's credentials or passwords
# of the user.
# Format: 'ldap property:alias'
# For example, 'userPassword:password'.
#
security.ldap.user.credential.0=userPassword:password
#security.ldap.user.credential.0=userCert:userCertificate
#
# The LDAP attribute names of an user
# Format: 'ldap property:alias'
#PЗдесь нам надо проинициализировать аттрибут sAMAccountName, для использования его #в качестве логина
security.ldap.user.prop.0=sAMAccountName:sAMAccountName
security.ldap.user.prop.1=displayName:cn
security.ldap.user.prop.2=ou
security.ldap.user.prop.3=objectClass:objectclass
security.ldap.user.prop.4=sn
security.ldap.user.prop.5=givenName:givenname
security.ldap.user.prop.6=mail:email
security.ldap.user.prop.7=cn:uid
security.ldap.user.prop.8=street:streetaddress
security.ldap.user.prop.9=roomNumber:roomnumber
security.ldap.user.prop.10=nsrole:nsrole
security.ldap.user.prop.11=nsroledn:nsroledn
#
# The LDAP atrribute names of a role or group
# Format: 'ldap property:alias'
#
security.ldap.role.prop.0=sn:sn
security.ldap.role.prop.1=ou:ou
security.ldap.role.prop.2=objectClass:objectclass
security.ldap.role.prop.3=member:member

Как видно из примера отличия весьма незначительны. Но настроить только ldap.properties недостаточно, т.к. подуровни (sub ou's) ou (organisational unit) будут недоступны, а это означает, что Вы можете работать только с пользователями, находящимися в ou=Users, также Вы не сможете авторизоваться используя sAMAccountName.

2. Обновление библиотек security
После настройки ldap.properties требуется сделать обновление библиотеки, отвечающие за security, скачать их можно отсюда: http://www.intalio.org/public/maven2/org/intalio/security/.

Список требуемых библиотек (Выбирайте желательно последние версии библиотек, на момент публикации последняя версия - 1.0.12):

Затем следует зайти в http://localhost:8080/axis2 -> Administration и проверить версию security-ws-service-x.x.xx. См. рисунок ниже.
Скорее всего Вы там увидите security-ws-service-1.0.4. Для того, чтобы обновить версию, Вам следует:
1. Удалить из папки [intalio_server]/webapps/axis2/WEB-INF/services файл security-ws-service-1.0.12.aar.
2. Загрузить новую версию сервиса, как показано на следующем рисунке:
3. Нужно обновить библиотеки security в UI-FW
Для обновления библиотек необходимо скопировать ранее скачанные файлы:
- security-api-1.0.12.jar
- security-web-nutsNbolts-1.0.12.jar
- security-ws-client-1.0.12.jar
- security-ws-common-1.0.12.jar
в папку [intalio_server]\webapps\ui-fw\WEB-INF\lib, затем старые версии библиотек требуется удалить.

4. Нужно обновить библиотеки security в BPMS-CONSOLE
Для обновления библиотек необходимо скопировать ранее скачанные файлы:
- security-api-1.0.12.jar
- security-web-nutsNbolts-1.0.12.jar
- security-ws-client-1.0.12.jar
- security-ws-common-1.0.12.jar
в папку [intalio_server]\webapps\bpms-console\WEB-INF\lib, затем старые версии библиотек требуется удалить.


5. Нужно обновить библиотеки security в GI
Для обновления библиотек необходимо скопировать ранее скачанные файлы:
- security-web-nutsNbolts-1.0.12.jar
в папку [intalio_server]\webapps\gi\WEB-INF\lib, затем старые версии библиотек требуется удалить.

5. Нужно обновить библиотеки security в WDS
Для обновления библиотек необходимо скопировать ранее скачанные файлы:
- security-api-1.0.12.jar
- security-web-nutsNbolts-1.0.12.jar
- security-ws-client-1.0.12.jar
- security-ws-common-1.0.12.jar
в папку [intalio_server]\webapps\wds\WEB-INF\lib, затем старые версии библиотек требуется удалить.

Теперь перезагружаем Intalio|Server и можем использовать Microsoft Active Directory.

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