Фильтры для 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, который вызывается кликом по фильтру, передать ему нужные параметры (и рассказать ему, как понимать эти параметры) и настроить внешний вид компонента. Внешний вид я настрою, а вот как функционирует фильтр, мне непонятно - я посмотрел небольшое количество джаваскрипта, но на понимание оно меня не натолкнуло.

Буду признателен на любые советы по этому вопросу; в первую очередь - что читать =).

Комментарии

Angelina аватар

Можно написать дашлет историй воркфлоу. Для работы с воркфлоу существуют такие Alfresco Workflow JavaScript API

Если АПИ не удовлетворяют всем нуждам, то можно написать свой root-scope object, используя WorkflowService API, при помощи которого из js выполнять все необъодимые операции, или же написать java-backed web-script, используя их же (Java Workflow API)

Стало яснее.

Спасибо, Angelina.

fufler аватар

Вы смотрели, как работают встроенные фильтры?

Для решения вашей задачи фильтрации можно использовать два (а может и больше способов):

  • пропатчить java-backed web script, отвечающий за выдачу списка процессов, так, чтобы он умел фильтровать по нужному вам механизму;
  • скрипт не трогать, писать фильтр тем способом, о котором вы написали выше.

Первый способ проще в реализации, зато второй не требует правки исходников. 

AFAIK при помощи JS API напрямую вытащить список завершённых процессов не удастся: нужно либо получить список всех завершенных тасков а по ним определить список процессов, либо же, как писала Angelina, писать свой root-scope object, реализующий нужный функционал.

 Смотрел, как работают, и, вроде, понял. По результатам работы так, правда, не кажется :).

Работаю в направлении дополнения существующих фильтров через workflow-list.get и иже с ними. Не особо получается -- видимо, чего-то в фильтрах я не понимаю: добавление в workflow-list.get.config.xml строки   <filter id="completed"     data="active"       parameters="state={data}&amp;assignee=myusername"/> возвращает вообще все активные процессы, без учёта bpm_assignee. Фильтр со state=completed генерирует ошибку загрузки окна (NPE в WorkflowInstancesGet.java, #155).

Учитывая http://localhost:8080/alfresco/service/script/org/alfresco/repository/workflow/workflow-instances.get, проблем быть не должно - и джава-код, и xml однозначно указывают на то, что по состоянию фильтровать можно; получается, что я где-то неправ, но где -- неясно. Ошибаться там вообще особо негде, релевантных строчек - полторы, если я всё правильно понимаю, что не факт. Идеи?

 

fufler аватар

<filter id="completed"     data="active"       parameters="state={data}&amp;assignee=myusername"/> возвращает вообще все активные процессы, без учёта bpm_assignee.

Скрипт по понятным причинам не умеет фильтровать по исполнителям. Если вам нужен этот функционал, нужно писать патч.

Фильтр со state=completed генерирует ошибку загрузки окна (NPE в WorkflowInstancesGet.java, #155).

Дебаггером не пробовали смотреть? В описании скрипта сказано, что state=COMPLETED | ACTIVE.

С assignee напутал, мой косяк.

 

Дебаггером не смотрел (как? :)), смотрел java-код. Параметр, передаваемый в state, приводится к верхнему регистру; "completed" должно работать, ноо почему-то нет. State=active работает нормально, state={completed} никак не меняет состояния контрола - даже выделенным остаётся предыдущий фильтр. Где-то я, видимо, идиот. Здесь надо сказать, что роль параметра "data" мне неясна -- это просто идентификатор фильтра, наряду с id, или он имеет сакральное значение, мне пока недоступное?

 

Фильтрация по state идёт до разбора фильтра; список workflow, который будет фильтроваться, берётся через getActiveWorkflows или getCompletedWorkflows, затем сортируется и пропускается через функцию matches (...), которая отрезает лишнее. Глупый вопрос: есть ли какая-то возможность влезть в java-код или пронаблюдать за его выполнением, без сборки всего alfresco из исходников? Я сознаю, что делаю что-то неправильно, но инструментов, которые помогли бы понять, что именно, сильно не хватает.

 

Насчёт assignee всё, похоже, интереснее: предстоит вытаскивать workflowID, проверять по нему тип процесса, вытаскивать второй таск, из него - assignee, и тогда оставлять. После последних трёх дней, в основном проведённых в исходниках, я надеюсь, что собственно написать эту джаву будет разумным усилием, иа вот что с ней дальше делать - понятия не имею. Просветите?

Нашёл на оффоруме  тред про подключение к работающему tomcat, в ответ на свой же вопрос про инструменты.

fufler аватар

 Это оно. Не забудьте пересобрать alfresco-*-repository.jar с отладочными символами.

"state=completed" мистически начало выдавать корректный JSON вместо HTTP500 после рестарта сервера. На линуксе. Я просто оставлю это здесь.

 

Исследую фильтрацию по типу БП и assignee второй задачи одновременно. Видимо, буду делать правкой WorkflowInstancesGet.

В каком случае возможны расхождения между результатом работы java-based webscript через /service/api и через вебинтерфейс? Вывод через logger даёт разные результаты в catalina.out, совершенно непонятно.

 

Фильтр расширен, несложен, работать должен корректно, но при вызове через share творится странное.

 

fufler аватар

 Обычно это связано с тем, что клиентский код написан неверно. Предлагаю ещё раз пройтись отладчиком.

Отладчик не подключался, сервер практически умирал во время попыток, 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'е; править его я пока не пробовал, т.к. собирать и отсылать эту махину по сети - долго и скучно. Если новых идей не будет, займусь этим, а пока - думаю и жду возможных подсказок со стороны форумчан.

Angelina аватар

Слушайте, напишите все таки свой java-backed web-script, который будет собирать историю воркфлоу так, как Вы хотите. А затем напишите дашлет, который будет вызывать это скрипт. ИМХО, лечге написать с нуля, чем править существующую конфигурацию. :)

Я могу послать Вам, если хотите, пример java-backed web-script-а сбора истории по определенному воркфлоу по всем юзерам. Здесь на  форуме fufler-а был также пример  дашлета, вызывающий вэб скрипт.

fufler аватар

 +1

 Похоже, что так и надо было сделать, но я этого не понял. Сейчас, увы, поздно - проект сдан, сделано ощутимо неоптимально, но, вроде, работает. У меня было два месяца, из которых один пошёл на написание БП, ещё две недели - на портирование под activiti и доработку, и две недели - на эти фильтры. Несложные вещи, но я впервые видел alfresco, и понаделал самых разных ошибок; опыт, во многом благодаря этому, получил бесценный.

 

Fufler, огромное спасибо Вам за помощь и за статьи - они помогли не меньше, чем все остальные материалы вместе взятые, которые я прочитал -- а это, наверное, пара тысяч страниц на всевозможные связанные темы. Это было круто.

Спасибо и Вам, Angelina, за советы и информацию.

 

Спасибо за помощь.