Без темы
<<  Расчет покупателей Реализация программы отказа от фреона  >>
Реализация интегрированных с Seam конвертеров для jBPM
Реализация интегрированных с Seam конвертеров для jBPM
Цели исследования
Цели исследования
Используемые версии фреймворков
Используемые версии фреймворков
Стандартное использование Bijection для переменных с BUSINESS_PROCESS
Стандартное использование Bijection для переменных с BUSINESS_PROCESS
Способ хранения переменных, прикрепленных к задаче, в базе данных jBPM
Способ хранения переменных, прикрепленных к задаче, в базе данных jBPM
Типы данных для переменных, поддерживаемые jBPM, и стандартные
Типы данных для переменных, поддерживаемые jBPM, и стандартные
Конфигурирование конвертеров в jBPM
Конфигурирование конвертеров в jBPM
Необходимость в реализации дополнительных конвертеров, постановка
Необходимость в реализации дополнительных конвертеров, постановка
Реализация аннотации для конвертера jBPM
Реализация аннотации для конвертера jBPM
Реализация конвертера jBPM
Реализация конвертера jBPM
Обработка аннотации и регистрация конвертера в jBPM во время
Обработка аннотации и регистрация конвертера в jBPM во время
Реализация класса JbpmConvertersLoader
Реализация класса JbpmConvertersLoader
Реализация класса JbpmConvertersLoader (часть 2)
Реализация класса JbpmConvertersLoader (часть 2)
Реализация класса JbpmConvertersLoader (часть 3)
Реализация класса JbpmConvertersLoader (часть 3)
Реализация класса JbpmConvertersLoader (часть 4)
Реализация класса JbpmConvertersLoader (часть 4)
Реализация класса JbpmConvertersLoader (часть 5)
Реализация класса JbpmConvertersLoader (часть 5)
Реализация класса ClassNameMatcher
Реализация класса ClassNameMatcher
Реализация класса ConvertersStorage
Реализация класса ConvertersStorage
Результат реализации и возможности использования дополнительных
Результат реализации и возможности использования дополнительных
Ваши вопросы
Ваши вопросы

Презентация: «Реализация интегрированных с Seam конвертеров для jBPM». Автор: Denis Sharay. Файл: «Реализация интегрированных с Seam конвертеров для jBPM.ppt». Размер zip-архива: 188 КБ.

Реализация интегрированных с Seam конвертеров для jBPM

содержание презентации «Реализация интегрированных с Seam конвертеров для jBPM.ppt»
СлайдТекст
1 Реализация интегрированных с Seam конвертеров для jBPM

Реализация интегрированных с Seam конвертеров для jBPM

2 Цели исследования

Цели исследования

Проанализировать стандартную реализацию конверторов типов в jBPM Определить ограничения накладываемые стандартной реализацией и найти пути для их обхода

3 Используемые версии фреймворков

Используемые версии фреймворков

Jboss seam: версия 2.2.0.GA jbpm: версия 3.2.2 (так как используется по умолчанию в seam, с которой данный фреймворк интегрирован)

4 Стандартное использование Bijection для переменных с BUSINESS_PROCESS

Стандартное использование Bijection для переменных с BUSINESS_PROCESS

контекст

Пример использования:

В данном случае, после выполнения метода createTodo(), выполняется Outjection поля payload, которую Seam сохраняет в BUSINESS_PROCESS контекст (поскольку Seam интегрирован с jBPM, то технически это реализуется как запись значения этого поля в виде переменной, прикрепленной к задаче(TaskInstance), в базу данных jBPM).

… @Name("todoList") public class TodoList implements Todo { … @Out(scope = ScopeType.BUSINESS_PROCESS, required = false) private Payload payload; … @CreateProcess(definition = "todo") public void createTodo() { payload = new Payload(); payload.setName(UUID.randomUUID().toString()); payload.setNumber(new Random().nextInt(1000)); entityManager.persist(payload); } … }

5 Способ хранения переменных, прикрепленных к задаче, в базе данных jBPM

Способ хранения переменных, прикрепленных к задаче, в базе данных jBPM

Переменные, прикрепленные к задаче jBPM, хранятся в таблице JBPM_VARIABLEINSTANCE, которая имеет следующую структуру:

Field

Type

Null

Key

Default

Extra

ID_

bigint(20)

No

PRI

NULL

auto_increment

CLASS_

char(1)

No

VERSION_

int(11)

No

NULL

NAME_

varchar(255)

Yes

NULL

CONVERTER_

varchar(255)

Yes

NULL

TOKEN_

bigint(20)

Yes

MUL

NULL

TOKENVARIABLEMAP_

bigint(20)

Yes

MUL

NULL

PROCESSINSTANCE_

bigint(20)

Yes

MUL

NULL

BYTEARRAYVALUE_

bigint(20)

Yes

MUL

NULL

DATEVALUE_

datetime

Yes

NULL

DOUBLEVALUE_

double

Yes

NULL

LONGIDCLASS_

varchar(255)

Yes

NULL

LONGVALUE_

bigint(20)

Yes

NULL

STRINGIDCLASS_

varchar(255)

Yes

NULL

STRINGVALUE_

varchar(255)

Yes

NULL

TASKINSTANCE_

bigint(20)

Yes

MUL

NULL

6 Типы данных для переменных, поддерживаемые jBPM, и стандартные

Типы данных для переменных, поддерживаемые jBPM, и стандартные

конвертеры для приведения к данным типам

BooleanToStringConverter BytesToByteArrayConverter ByteToLongConverter CharacterToStringConverter DateToLongConverter DoubleToStringConverter FloatToDoubleConverter FloatToStringConverter IntegerToLongConverter SerializableToByteArrayConverter ShortToLongConverter

Исходя из предыдущей таблицы, типы данных, которые могут хранится в таблице переменных процесса, это byte[], Date, double, long, string, при этом значения переменных записываются в одно из полей таблицы: BYTEARRAYVALUE_, DATEVALUE_, DOUBLEVALUE_, LONGVALUE_ и STRINGVALUE_, соответственно. (Для объектов, которые сохраняются с использованием Hibernate предусмотрены также поля LONGIDCLASS_ и STRINGIDCLASS_, для ID с типом Long или String, соответственно). Для преобразования объектов произвольных Java-классов к вышеуказанным типам данных в jBPM реализованы следующие стандартные конвертеры:

7 Конфигурирование конвертеров в jBPM

Конфигурирование конвертеров в jBPM

Конфигурация конвертеров в jBPM производится в конфигурационном файле jbpm.varmapping.xml следующим образом:

Где matcher содержит описание класса для проверки соответствия типа данных переменной типу данных, который преобразует конвертер, указанный в теге converter, а variable-instance содержит тип данных после преобразования (один из предопределенных в jbpm), который будет сохранятся в базу данных.

<jbpm-type> <matcher> <bean class="org.jbpm.context.exe.matcher.ClassNameMatcher"> <field name="className"><string value="java.lang.Boolean" /></field> </bean> </matcher> <converter class="org.jbpm.context.exe.converter.BooleanToStringConverter" /> <variable-instance class="org.jbpm.context.exe.variableinstance.StringInstance" /> </jbpm-type>

8 Необходимость в реализации дополнительных конвертеров, постановка

Необходимость в реализации дополнительных конвертеров, постановка

задачи

Как следует из рассмотренного выше списка конвертеров, в стандартной реализации jBPM существует возможность для конвертации только ограниченного числа стандартных типов Java. В случае если переменная представляет собой объект некоторого произвольного класса остается возможность для использования конвертера SerializableToByteArrayConverter для сохранения объекта в базе данных (для этого данный класс должен реализовывать интерфейс Serializable). Минус использования конвертера SerializableToByteArrayConverter заключается в том, что в базу данных сохраняются данные в бинарном виде, что вызовет проблемы в случае необходимости в дальнейшем производить поиск и обработку сохраненных данных. Таким образом возникает задача: реализовать дополнительные конвертеры jBPM для преобразования произвольных объектов Java к виду, удобному для их поиска по какому-либо фильтру и последующей обработки, с их интеграцией с фреймворком Seam.

9 Реализация аннотации для конвертера jBPM

Реализация аннотации для конвертера jBPM

Дополнительные конвертеров jBPM будем реализовывать по аналогии с конвертерами JSF, когда для регистрации и использования конвертеров в Seam достаточно проставить аннотацию для класса, реализующего конвертер. Аннотация для конвертера jBPM реализована следующим образом:

Таким образом, для реализации конвертера jBPM необходимо и достаточно, чтобы для этого класса была указана данная аннотация, а также класс конвертера реализовывал интерфейс org.jbpm.context.exe.Converter.

… @Target(TYPE) @Retention(RUNTIME) @Scope(ScopeType.APPLICATION) @BypassInterceptors @Install(dependencies = "org.jboss.seam.bpm.jbpm") public @interface JbpmConverter { String jbpmConverterId() default "0"; Class<?> forClass() default void.class; Class<? extends VariableInstance> toJbpmVariableClass() default VariableInstance.class; }

10 Реализация конвертера jBPM

Реализация конвертера jBPM

Пример реализации конвертера jBPM, исходя из указанных на предыдущем слайде условий:

… @Name("com.artezio.jbpm.converter.PayloadToLongConverter") @JbpmConverter(jbpmConverterId = "Z", forClass = Payload.class, toJbpmVariableClass = LongInstance.class) public class PayloadToLongConverter implements Converter { ... public boolean supports(Object value) { if (value == null) { return true; } return (value.getClass() == Payload.class); } public Object convert(Object o) { return ((Payload) o).getId(); } public Object revert(Object o) { EntityManager entityManager = (EntityManager) Component.getInstance("entityManager"); return entityManager.find(Payload.class, (Long) o); } }

11 Обработка аннотации и регистрация конвертера в jBPM во время

Обработка аннотации и регистрация конвертера в jBPM во время

инициализации приложения

В предыдущем примере элементы аннотации конвертера имеют следующее значение: jbpmConverterId – id конвертера, с которым конвертер зарегистрирован в jBPM, forClass – класс, для которого должен применятся этот конвертер, toJbpmVariableClass – класс, в который производится преобразование (является стандартным классом jBPM и представляет собой один из типов данных, который сохраняется в таблицу JBPM_VARIABLEINSTANCE базы данных jBPM).

Для использования конвертера необходимо зарегистрировать его в jBPM, для этого используется обработка стандартного события Seam - org.jboss.seam.postInitialization, которое генерируется при старте приложения, после инициализации всех компонентов Seam. (Обработка компонентов Seam c аннотацией и реализация регистрации конвертеров jBPM находится в классе JbpmConvertersLoader).

12 Реализация класса JbpmConvertersLoader

Реализация класса JbpmConvertersLoader

Получение имен всех компонентов Seam в контексте Application:

... @Name("com.artezio.jbpm.JbpmConvertersLoader") @Scope(ScopeType.APPLICATION) @Install(dependencies = "org.jboss.seam.bpm.jbpm") public class JbpmConvertersLoader { @Observer("org.jboss.seam.postInitialization") public void registerJbpmConverters() { if (Contexts.isApplicationContextActive()) { String[] names = Contexts.getApplicationContext().getNames(); if (names != null) { for (String name : names) { processComponent(name); } } } } … }

13 Реализация класса JbpmConvertersLoader (часть 2)

Реализация класса JbpmConvertersLoader (часть 2)

Определение среди всех компонентов Seam конвертеров jBPM и их регистрация:

... @Name("com.artezio.jbpm.JbpmConvertersLoader") @Scope(ScopeType.APPLICATION) @Install(dependencies = "org.jboss.seam.bpm.jbpm") public class JbpmConvertersLoader { ... private void processComponent(String name) { Object obj = Contexts.getApplicationContext().get(name); if (obj instanceof Component && ((Component) obj) .beanClassHasAnnotation(JbpmConverter.class)) { Class<?> beanClass = ((Component) obj).getBeanClass(); JbpmConverter annotation = beanClass.getAnnotation(JbpmConverter.class); registerConverter(beanClass, annotation); } } … }

14 Реализация класса JbpmConvertersLoader (часть 3)

Реализация класса JbpmConvertersLoader (часть 3)

Регистрация конвертера jBPM:

... @Name("com.artezio.jbpm.JbpmConvertersLoader") @Scope(ScopeType.APPLICATION) @Install(dependencies = "org.jboss.seam.bpm.jbpm") public class JbpmConvertersLoader { ... private void registerConverter(Class<?> beanClass, JbpmConverter annotation) { Object converter = Component.getInstance(beanClass); String id = annotation.jbpmConverterId(); Class<?> initialClass = annotation.forClass(); Class<? extends VariableInstance> variableClass = annotation.toJbpmVariableClass(); if (converter instanceof Converter) { addConverter(id, (Converter) converter); addJbpmType(initialClass, (Converter) converter, variableClass); } else { new IllegalArgumentException( "jBPM Converter "+ beanClass.getName() + " must implements org.jbpm.context.exe.Converter interface"); } } … }

15 Реализация класса JbpmConvertersLoader (часть 4)

Реализация класса JbpmConvertersLoader (часть 4)

Добавление конвертера jBPM в коллекции конвертеров (необходимо для обратной конвертации из объекта VariableInstance в исходный объект):

... @Name("com.artezio.jbpm.JbpmConvertersLoader") @Scope(ScopeType.APPLICATION) @Install(dependencies = "org.jboss.seam.bpm.jbpm") public class JbpmConvertersLoader { ... private void addConverter(String id, Converter jbpmConverter) { Map<String, Converter> convertersByClassNames = ConvertersStorage.getConvertersByClassNames(); Map<String, Converter> convertersByDatabaseId = ConvertersStorage.getConvertersByDatabaseId(); Map<Converter, String> convertersIds = ConvertersStorage.getConvertersIds(); if (id == null || id.length() != 1) { throw new JbpmException("converter-ids must be of length 1 (to be stored in a char)"); } if (convertersByDatabaseId.containsKey(id)) { throw new JbpmException("duplicate converter id : '" + id + "'"); } convertersByClassNames.put(jbpmConverter.getClass().getName(),jbpmConverter); convertersByDatabaseId.put(id, jbpmConverter); convertersIds.put(jbpmConverter, id); } … }

16 Реализация класса JbpmConvertersLoader (часть 5)

Реализация класса JbpmConvertersLoader (часть 5)

Добавление типа jBPM (необходимо для прямой конвертации из исходного объекта в объект VariableInstance):

... @Name("com.artezio.jbpm.JbpmConvertersLoader") @Scope(ScopeType.APPLICATION) @Install(dependencies = "org.jboss.seam.bpm.jbpm") public class JbpmConvertersLoader { ... @SuppressWarnings("unchecked") private void addJbpmType(Class<?> initialClass, Converter jbpmConverter, Class<? extends VariableInstance> variableClass) { JbpmType newType = new JbpmType(new ClassNameMatcher(initialClass), jbpmConverter, variableClass); List<JbpmType> types = (List<JbpmType>) JbpmType.getJbpmTypes(); if (types != null) { types.add(0, newType); } } … }

17 Реализация класса ClassNameMatcher

Реализация класса ClassNameMatcher

Реализация класса ClassNameMatcher (необходим для определения соответствующего конвертера для определенного класса):

... import org.jbpm.context.exe.JbpmTypeMatcher; public class ClassNameMatcher implements JbpmTypeMatcher { private static final long serialVersionUID = -5565431274447538627L; private Class<?> classType; public ClassNameMatcher(Class<?> classType) { this.classType = classType; } public boolean matches(Object value) { return classType == value.getClass(); } }

18 Реализация класса ConvertersStorage

Реализация класса ConvertersStorage

Реализация класса ConvertersStorage (необходим для доступа к коллекциям конвертеров jBPM):

package org.jbpm.db.hibernate; … public class ConvertersStorage { @SuppressWarnings("unchecked") public static Map<String, Converter> getConvertersByClassNames() { return Converters.getConverterMaps()[Converters.CONVERTERS_BY_CLASS_NAMES]; } @SuppressWarnings("unchecked") public static Map<String, Converter> getConvertersByDatabaseId() { return Converters.getConverterMaps()[Converters.CONVERTERS_BY_DATABASE_ID]; } @SuppressWarnings("unchecked") public static Map<Converter, String> getConvertersIds() { return Converters.getConverterMaps()[Converters.CONVERTERS_IDS]; } }

19 Результат реализации и возможности использования дополнительных

Результат реализации и возможности использования дополнительных

конвертеров jBPM

Таким образом, была рассмотрена задача добавления дополнительных конвертеров jBPM, интегрированных с фреймворком Seam. В результате проведенной работы, была реализована возможность добавления конвертеров jBPM для произвольных объектов Java c помощью аннотаций. Данная дополнительная функциональность позволяет избежать проблем, связанных с необходимостью обработки сериализованных объектов, хранящихся в базе данных в бинарном виде, позволяя сохранять объекты в базу данных jBPM в произвольном, удобном для обработки виде. При этом, реализация новых конвертеров jBPM, реализованным способом, практически не требует дополнительных трудозатрат.

20 Ваши вопросы

Ваши вопросы

«Реализация интегрированных с Seam конвертеров для jBPM»
http://900igr.net/prezentacija/ekonomika/realizatsija-integrirovannykh-s-seam-konverterov-dlja-jbpm-87318.html
cсылка на страницу
Урок

Экономика

125 тем
Слайды
900igr.net > Презентации по экономике > Без темы > Реализация интегрированных с Seam конвертеров для jBPM