Фильтры для my-workflows
Добрый день, участники форума,
передо мной стоит задача расширения компонента "workflows I've started" в share для поиска по экземплярам собственного БП. БП имеет двух исполнителей помимо initiator'а, и расширенный компонент должен уметь искать те экземпляры, в которых текущий пользователь является bpm:assignee; плюс надо уметь вытаскивать завершённые БП, где он был таковым.
Система - 4.0.0, БП переносится с jBPM на Activiti.
На этот момент я нагуглил http://code.google.com/p/qbreng-alfresco-extensions/wiki/MyCompletedTasks для 3.4, но на workflow оно на распространяется. Собственно, мне неясно, с какой стороны с проблеме подойти - с alfresco я работаю только около месяца, и ещё через месяц буду заниматься привычным c#, поэтому в понимании системы ощутимо ограничен.
Судя по всему, мне предстоит написать или расширить некоторый js, который вызывается кликом по фильтру, передать ему нужные параметры (и рассказать ему, как понимать эти параметры) и настроить внешний вид компонента. Внешний вид я настрою, а вот как функционирует фильтр, мне непонятно - я посмотрел небольшое количество джаваскрипта, но на понимание оно меня не натолкнуло.
Буду признателен на любые советы по этому вопросу; в первую очередь - что читать =).
Комментарии
21/02/2012 - 13:18
Можно написать дашлет историй воркфлоу. Для работы с воркфлоу существуют такие Alfresco Workflow JavaScript API
Если АПИ не удовлетворяют всем нуждам, то можно написать свой root-scope object, используя WorkflowService API, при помощи которого из js выполнять все необъодимые операции, или же написать java-backed web-script, используя их же (Java Workflow API)
22/02/2012 - 09:00
Стало яснее.
Спасибо, Angelina.
26/02/2012 - 10:17
Вы смотрели, как работают встроенные фильтры?
Для решения вашей задачи фильтрации можно использовать два (а может и больше способов):
Первый способ проще в реализации, зато второй не требует правки исходников.
AFAIK при помощи JS API напрямую вытащить список завершённых процессов не удастся: нужно либо получить список всех завершенных тасков а по ним определить список процессов, либо же, как писала Angelina, писать свой root-scope object, реализующий нужный функционал.
29/02/2012 - 11:24
Смотрел, как работают, и, вроде, понял. По результатам работы так, правда, не кажется :).
Работаю в направлении дополнения существующих фильтров через workflow-list.get и иже с ними. Не особо получается -- видимо, чего-то в фильтрах я не понимаю: добавление в workflow-list.get.config.xml строки <filter id="completed" data="active" parameters="state={data}&assignee=myusername"/> возвращает вообще все активные процессы, без учёта bpm_assignee. Фильтр со state=completed генерирует ошибку загрузки окна (NPE в WorkflowInstancesGet.java, #155).
Учитывая http://localhost:8080/alfresco/service/script/org/alfresco/repository/workflow/workflow-instances.get, проблем быть не должно - и джава-код, и xml однозначно указывают на то, что по состоянию фильтровать можно; получается, что я где-то неправ, но где -- неясно. Ошибаться там вообще особо негде, релевантных строчек - полторы, если я всё правильно понимаю, что не факт. Идеи?
29/02/2012 - 20:46
Скрипт по понятным причинам не умеет фильтровать по исполнителям. Если вам нужен этот функционал, нужно писать патч.
Дебаггером не пробовали смотреть? В описании скрипта сказано, что state=COMPLETED | ACTIVE.
01/03/2012 - 17:11
С assignee напутал, мой косяк.
Дебаггером не смотрел (как? :)), смотрел java-код. Параметр, передаваемый в state, приводится к верхнему регистру; "completed" должно работать, ноо почему-то нет. State=active работает нормально, state={completed} никак не меняет состояния контрола - даже выделенным остаётся предыдущий фильтр. Где-то я, видимо, идиот. Здесь надо сказать, что роль параметра "data" мне неясна -- это просто идентификатор фильтра, наряду с id, или он имеет сакральное значение, мне пока недоступное?
Фильтрация по state идёт до разбора фильтра; список workflow, который будет фильтроваться, берётся через getActiveWorkflows или getCompletedWorkflows, затем сортируется и пропускается через функцию matches (...), которая отрезает лишнее. Глупый вопрос: есть ли какая-то возможность влезть в java-код или пронаблюдать за его выполнением, без сборки всего alfresco из исходников? Я сознаю, что делаю что-то неправильно, но инструментов, которые помогли бы понять, что именно, сильно не хватает.
Насчёт assignee всё, похоже, интереснее: предстоит вытаскивать workflowID, проверять по нему тип процесса, вытаскивать второй таск, из него - assignee, и тогда оставлять. После последних трёх дней, в основном проведённых в исходниках, я надеюсь, что собственно написать эту джаву будет разумным усилием, иа вот что с ней дальше делать - понятия не имею. Просветите?
02/03/2012 - 10:15
Нашёл на оффоруме тред про подключение к работающему tomcat, в ответ на свой же вопрос про инструменты.
02/03/2012 - 12:32
Это оно. Не забудьте пересобрать alfresco-*-repository.jar с отладочными символами.
06/03/2012 - 15:30
"state=completed" мистически начало выдавать корректный JSON вместо HTTP500 после рестарта сервера. На линуксе. Я просто оставлю это здесь.
Исследую фильтрацию по типу БП и assignee второй задачи одновременно. Видимо, буду делать правкой WorkflowInstancesGet.
12/03/2012 - 15:10
В каком случае возможны расхождения между результатом работы java-based webscript через /service/api и через вебинтерфейс? Вывод через logger даёт разные результаты в catalina.out, совершенно непонятно.
Фильтр расширен, несложен, работать должен корректно, но при вызове через share творится странное.
14/03/2012 - 15:33
Обычно это связано с тем, что клиентский код написан неверно. Предлагаю ещё раз пройтись отладчиком.
15/03/2012 - 15:34
Отладчик не подключался, сервер практически умирал во время попыток, eclipse не показывал ничего интереснее threadlocal. С высокой вероятностью это - мои недостаточно прямые руки, но этот этап практически пройден; я честно провёл за этим около одного рабочего дня, после чего плюнул и наставил везде logger.debug'ов.
Как выяснилось вчера, разница была вызвана тем, что при запуске через share к фильтру добавлялись условия на initiator и exclude, а через /service/api - нет.
workflow-list.js добавляет в запрос initiator'а, и я его (initiator'a) оттуда убил, но результатов это не дало.
Теперь ещё никак не удаётся локализовать стандартные уведомления о БП, лежащие в wf-email.html.ftl; перевёл, добавил, добавил в workflow-email-notification.xml, сервер стартует с русской локалью, локаль браузера - русская; мыло приходит на английском, невзирая ни на что, даже если я удаляю английский wf-email.html.ftl совсем. Файл такой - один, ссылок на него не видно,в джарниках нету, если только в alfresco.war'е; править его я пока не пробовал, т.к. собирать и отсылать эту махину по сети - долго и скучно. Если новых идей не будет, займусь этим, а пока - думаю и жду возможных подсказок со стороны форумчан.
16/03/2012 - 10:16
Слушайте, напишите все таки свой java-backed web-script, который будет собирать историю воркфлоу так, как Вы хотите. А затем напишите дашлет, который будет вызывать это скрипт. ИМХО, лечге написать с нуля, чем править существующую конфигурацию. :)
Я могу послать Вам, если хотите, пример java-backed web-script-а сбора истории по определенному воркфлоу по всем юзерам. Здесь на форуме fufler-а был также пример дашлета, вызывающий вэб скрипт.
16/03/2012 - 16:12
+1
19/03/2012 - 11:13
Похоже, что так и надо было сделать, но я этого не понял. Сейчас, увы, поздно - проект сдан, сделано ощутимо неоптимально, но, вроде, работает. У меня было два месяца, из которых один пошёл на написание БП, ещё две недели - на портирование под activiti и доработку, и две недели - на эти фильтры. Несложные вещи, но я впервые видел alfresco, и понаделал самых разных ошибок; опыт, во многом благодаря этому, получил бесценный.
Fufler, огромное спасибо Вам за помощь и за статьи - они помогли не меньше, чем все остальные материалы вместе взятые, которые я прочитал -- а это, наверное, пара тысяч страниц на всевозможные связанные темы. Это было круто.
Спасибо и Вам, Angelina, за советы и информацию.
Спасибо за помощь.