200 likes | 442 Views
Реализация интегрированных с Seam конвертеров для jBPM. Цели исследования. Проанализировать стандартную реализацию конверторов типов в jBPM Определить ограничения накладываемые стандартной реализацией и найти пути для их обхода. Используемые версии фреймворков. JBoss Seam:
E N D
Реализация интегрированных с Seam конвертеров для jBPM
Цели исследования • Проанализировать стандартную реализацию конверторов типов в jBPM • Определить ограничения накладываемые стандартной реализацией и найти пути для их обхода
Используемые версии фреймворков • JBoss Seam: версия 2.2.0.GA • jBPM: версия 3.2.2 (так как используется по умолчанию в Seam, с которой данный фреймворк интегрирован)
Стандартное использование Bijection для переменных с BUSINESS_PROCESS контекст • Пример использования: В данном случае, после выполнения метода createTodo(), выполняется Outjection поля payload, которую Seam сохраняет в BUSINESS_PROCESS контекст (поскольку Seam интегрирован с jBPM, то технически это реализуется как запись значения этого поля в виде переменной, прикрепленной к задаче(TaskInstance), в базу данных jBPM).
Способ хранения переменных, прикрепленных к задаче, в базе данных jBPM • Переменные, прикрепленные к задаче jBPM, хранятся в таблице JBPM_VARIABLEINSTANCE, которая имеет следующую структуру:
Типы данныхдля переменных, поддерживаемые jBPM,и стандартные конвертеры для приведения к данным типам • Исходя из предыдущей таблицы, типы данных, которые могут хранится в таблице переменных процесса, это byte[], Date, double, long, string, при этом значения переменных записываются в одно из полей таблицы: BYTEARRAYVALUE_, DATEVALUE_, DOUBLEVALUE_, LONGVALUE_ и STRINGVALUE_, соответственно. (Для объектов, которые сохраняются с использованием Hibernate предусмотрены также поля LONGIDCLASS_ и STRINGIDCLASS_, для ID с типом Long или String, соответственно). • Для преобразования объектов произвольных Java-классов к вышеуказанным типам данных в jBPMреализованы следующие стандартные конвертеры: • BooleanToStringConverter • BytesToByteArrayConverter • ByteToLongConverter • CharacterToStringConverter • DateToLongConverter • DoubleToStringConverter • FloatToDoubleConverter • FloatToStringConverter • IntegerToLongConverter • SerializableToByteArrayConverter • ShortToLongConverter
Конфигурирование конвертеров в jBPM • Конфигурация конвертеров в jBPM производится в конфигурационном файле jbpm.varmapping.xml следующим образом: гдеmatcherсодержит описание класса для проверки соответствия типа данных переменной типу данных, который преобразует конвертер, указанный в теге converter, а variable-instanceсодержит тип данных после преобразования (одиниз предопределенных в jBPM), который будет сохранятся в базу данных.
Необходимость в реализации дополнительных конвертеров, постановка задачи • Как следует из рассмотренного выше списка конвертеров, в стандартной реализации jBPMсуществует возможность для конвертации только ограниченного числа стандартных типов Java. • В случае если переменная представляет собой объект некоторого произвольного класса остается возможность для использования конвертера SerializableToByteArrayConverterдля сохранения объекта в базе данных (для этого данный класс должен реализовывать интерфейс Serializable). • Минус использования конвертера SerializableToByteArrayConverter заключается в том, что в базу данных сохраняются данные в бинарном виде, что вызовет проблемы в случае необходимости в дальнейшем производить поиск и обработку сохраненных данных. • Таким образом возникает задача: реализовать дополнительные конвертеры jBPM для преобразования произвольных объектов Java к виду, удобному для их поиска по какому-либо фильтру и последующей обработки, с их интеграцией с фреймворкомSeam.
Реализация аннотации для конвертера jBPM • Дополнительные конвертеров jBPM будем реализовывать по аналогии с конвертерами JSF, когда для регистрации и использования конвертеров в Seam достаточно проставить аннотацию для класса, реализующего конвертер. • Аннотация для конвертера jBPM реализована следующим образом: Таким образом, для реализации конвертера jBPMнеобходимо и достаточно, чтобы для этого класса была указана данная аннотация, а также класс конвертера реализовывал интерфейс org.jbpm.context.exe.Converter.
Реализация конвертера jBPM • Пример реализации конвертера jBPM, исходя из указанных на предыдущем слайде условий:
Обработка аннотации и регистрация конвертера в jBPM во время инициализации приложения • В предыдущем примере элементы аннотации конвертера имеют следующее значение: jbpmConverterId – id конвертера, с которым конвертер зарегистрирован в jBPM, forClass – класс, для которого должен применятся этот конвертер, toJbpmVariableClass – класс, в который производится преобразование (является стандартным классом jBPM и представляет собой один из типов данных, который сохраняется в таблицу JBPM_VARIABLEINSTANCE базы данных jBPM). • Для использования конвертера необходимо зарегистрировать его в jBPM, для этого используется обработка стандартного события Seam - org.jboss.seam.postInitialization, которое генерируется при старте приложения, после инициализации всех компонентов Seam. (Обработка компонентов Seam c аннотацией и реализация регистрации конвертеров jBPMнаходится в классе JbpmConvertersLoader).
Реализация класса JbpmConvertersLoader • Получение имен всех компонентов Seam вконтексте Application:
Реализация класса JbpmConvertersLoader(часть 2) • Определение среди всех компонентов Seam конвертеров jBPM и их регистрация:
Реализация класса JbpmConvertersLoader(часть 3) • Регистрация конвертера jBPM:
Реализация класса JbpmConvertersLoader(часть 4) • Добавление конвертера jBPM в коллекции конвертеров (необходимо для обратной конвертации из объекта VariableInstance в исходный объект):
Реализация класса JbpmConvertersLoader(часть 5) • Добавление типа jBPM (необходимо для прямой конвертации из исходного объекта в объект VariableInstance):
Реализация класса ClassNameMatcher • Реализация класса ClassNameMatcher (необходим для определения соответствующего конвертера для определенного класса):
Реализация класса ConvertersStorage • Реализация класса ConvertersStorage(необходим для доступа к коллекциям конвертеров jBPM):
Результат реализации и возможности использования дополнительных конвертеров jBPM • Таким образом, была рассмотрена задача добавления дополнительных конвертеров jBPM, интегрированных с фреймворком Seam. В результате проведенной работы, была реализована возможность добавления конвертеров jBPM для произвольных объектов Java c помощью аннотаций. • Данная дополнительная функциональность позволяет избежать проблем, связанных с необходимостью обработки сериализованных объектов, хранящихся в базе данных в бинарном виде, позволяя сохранять объекты в базу данных jBPM в произвольном, удобном для обработки виде. При этом, реализация новых конвертеров jBPM, реализованным способом, практически не требует дополнительных трудозатрат.