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

20
Artezio LLC Address: 3G Gubkina Str., suite 504, Moscow, Russia, 119333 Phone: +7 (495) 981-0531 Fax: +7 (495) 232-2683 Email: [email protected] www.artezio.com The art of technology Реализация интегрированных с Seam конвертеров для jBPM

Upload: elan

Post on 16-Mar-2016

83 views

Category:

Documents


4 download

DESCRIPTION

Реализация интегрированных с Seam конвертеров для jBPM. Цели исследования. Проанализировать стандартную реализацию конверторов типов в jBPM Определить ограничения накладываемые стандартной реализацией и найти пути для их обхода. Используемые версии фреймворков. JBoss Seam: - PowerPoint PPT Presentation

TRANSCRIPT

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

Artezio LLC Address: 3G Gubkina Str., suite 504, Moscow, Russia, 119333 Phone: +7 (495) 981-0531 Fax: +7 (495) 232-2683 Email: [email protected]

www.artezio.comThe art of technology

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

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

Artezio LLC Address: 3G Gubkina Str., suite 504, Moscow, Russia, 119333 Phone: +7 (495) 981-0531 Fax: +7 (495) 232-2683 Email: [email protected]

www.artezio.comThe art of technology

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

Проанализировать стандартную реализацию конверторов типов в jBPM

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

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

Artezio LLC Address: 3G Gubkina Str., suite 504, Moscow, Russia, 119333 Phone: +7 (495) 981-0531 Fax: +7 (495) 232-2683 Email: [email protected]

www.artezio.comThe art of technology

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

• JBoss Seam: версия 2.2.0.GA

• jBPM: версия 3.2.2 (так как используется по умолчанию в Seam, с которой данный фреймворк

интегрирован)

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

Artezio LLC Address: 3G Gubkina Str., suite 504, Moscow, Russia, 119333 Phone: +7 (495) 981-0531 Fax: +7 (495) 232-2683 Email: [email protected]

www.artezio.comThe art of technology

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

…@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); } …}

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

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

Artezio LLC Address: 3G Gubkina Str., suite 504, Moscow, Russia, 119333 Phone: +7 (495) 981-0531 Fax: +7 (495) 232-2683 Email: [email protected]

www.artezio.comThe art of technology

Способ хранения переменных, прикрепленных к задаче, в базе данных 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

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

Artezio LLC Address: 3G Gubkina Str., suite 504, Moscow, Russia, 119333 Phone: +7 (495) 981-0531 Fax: +7 (495) 232-2683 Email: [email protected]

www.artezio.comThe art of technology

Типы данных для переменных, поддерживаемые 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

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

Artezio LLC Address: 3G Gubkina Str., suite 504, Moscow, Russia, 119333 Phone: +7 (495) 981-0531 Fax: +7 (495) 232-2683 Email: [email protected]

www.artezio.comThe art of technology

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

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

<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>

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

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

Artezio LLC Address: 3G Gubkina Str., suite 504, Moscow, Russia, 119333 Phone: +7 (495) 981-0531 Fax: +7 (495) 232-2683 Email: [email protected]

www.artezio.comThe art of technology

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

• Как следует из рассмотренного выше списка конвертеров, в стандартной реализации jBPM существует возможность для конвертации только ограниченного числа стандартных типов Java.

• В случае если переменная представляет собой объект некоторого произвольного класса остается возможность для использования конвертера SerializableToByteArrayConverter для сохранения объекта в базе данных (для этого данный класс должен реализовывать интерфейс Serializable).

• Минус использования конвертера SerializableToByteArrayConverter заключается в том, что в базу данных сохраняются данные в бинарном виде, что вызовет проблемы в случае необходимости в дальнейшем производить поиск и обработку сохраненных данных.

• Таким образом возникает задача: реализовать дополнительные конвертеры jBPM для преобразования произвольных объектов Java к виду, удобному для их поиска по какому-либо фильтру и последующей обработки, с их интеграцией с фреймворком Seam.

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

Artezio LLC Address: 3G Gubkina Str., suite 504, Moscow, Russia, 119333 Phone: +7 (495) 981-0531 Fax: +7 (495) 232-2683 Email: [email protected]

www.artezio.comThe art of technology

Реализация аннотации для конвертера jBPM• Дополнительные конвертеров jBPM будем реализовывать по аналогии с конвертерами JSF, когда для

регистрации и использования конвертеров в Seam достаточно проставить аннотацию для класса, реализующего конвертер.

• Аннотация для конвертера jBPM реализована следующим образом:

…@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;}

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

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

Artezio LLC Address: 3G Gubkina Str., suite 504, Moscow, Russia, 119333 Phone: +7 (495) 981-0531 Fax: +7 (495) 232-2683 Email: [email protected]

www.artezio.comThe art of technology

Реализация конвертера 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); }}

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

Artezio LLC Address: 3G Gubkina Str., suite 504, Moscow, Russia, 119333 Phone: +7 (495) 981-0531 Fax: +7 (495) 232-2683 Email: [email protected]

www.artezio.comThe art of technology

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

классом jBPM и представляет собой один из типов данных, который сохраняется в таблицу JBPM_VARIABLEINSTANCE базы данных jBPM).

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

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

Artezio LLC Address: 3G Gubkina Str., suite 504, Moscow, Russia, 119333 Phone: +7 (495) 981-0531 Fax: +7 (495) 232-2683 Email: [email protected]

www.artezio.comThe art of technology

Реализация класса 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); } } } }…}

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

Artezio LLC Address: 3G Gubkina Str., suite 504, Moscow, Russia, 119333 Phone: +7 (495) 981-0531 Fax: +7 (495) 232-2683 Email: [email protected]

www.artezio.comThe art of technology

Реализация класса 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); } }…}

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

Artezio LLC Address: 3G Gubkina Str., suite 504, Moscow, Russia, 119333 Phone: +7 (495) 981-0531 Fax: +7 (495) 232-2683 Email: [email protected]

www.artezio.comThe art of technology

Реализация класса 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"); } }…}

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

Artezio LLC Address: 3G Gubkina Str., suite 504, Moscow, Russia, 119333 Phone: +7 (495) 981-0531 Fax: +7 (495) 232-2683 Email: [email protected]

www.artezio.comThe art of technology

Реализация класса 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); }…}

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

Artezio LLC Address: 3G Gubkina Str., suite 504, Moscow, Russia, 119333 Phone: +7 (495) 981-0531 Fax: +7 (495) 232-2683 Email: [email protected]

www.artezio.comThe art of technology

Реализация класса 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); } }…}

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

Artezio LLC Address: 3G Gubkina Str., suite 504, Moscow, Russia, 119333 Phone: +7 (495) 981-0531 Fax: +7 (495) 232-2683 Email: [email protected]

www.artezio.comThe art of technology

Реализация класса 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(); }}

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

Artezio LLC Address: 3G Gubkina Str., suite 504, Moscow, Russia, 119333 Phone: +7 (495) 981-0531 Fax: +7 (495) 232-2683 Email: [email protected]

www.artezio.comThe art of technology

Реализация класса 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]; }}

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

Artezio LLC Address: 3G Gubkina Str., suite 504, Moscow, Russia, 119333 Phone: +7 (495) 981-0531 Fax: +7 (495) 232-2683 Email: [email protected]

www.artezio.comThe art of technology

Результат реализации и возможности использования дополнительных конвертеров jBPM Таким образом, была рассмотрена задача добавления дополнительных конвертеров

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

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

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

Artezio LLC Address: 3G Gubkina Str., suite 504, Moscow, Russia, 119333 Phone: +7 (495) 981-0531 Fax: +7 (495) 232-2683 Email: [email protected]

www.artezio.comThe art of technology

Ваши вопросы