====== Lab 2: Podstawy pracy z Activiti Designerem ====== Webowy Activiti Modeler ma spore ograniczenia. Więcej możliwości daje projektantom procesów eclipsowy Activiti Designer, w którym można specyfikować dodatkowe właściwości elementów. W związku z tym dziś przeniesiemy nasz model do Eclipsa, a ponadto przygotujemy dla niego jUnit test. ===== Instalacja wtyczki m2e ===== W przypadku, gdy brakowałoby odpowiedniej wtyczki m2e w środowisku eclipse, \\ proszę ją doinstalować ze strony: [[http://download.eclipse.org/technology/m2e/releases|wtyczkę m2e (Maven Integration for Eclipse)]] w wersji 1.4.1. \\ Gdyby brakowało slf4j, można doinstalować je z innego repozytorium, np. http://www.fuin.org/p2-repository/.\\ Po instalacji należy zrestartować eclipse'a. ===== Utworzenie projektu i modelu ===== Proszę w eclipsie stworzyć nowy projekt: **New -> Project...**, następnie **Activiti -> Activiti Project**. Dodajemy do projektu w: **src/main/resources/java** pusty diagram Activiti (**New->Other..., Activiti -> Activiti Diagram**).\\ Proszę teraz zamodelować jakiś najprostszy proces. ===== Testowanie modelu ===== Następnie skonwertuj projekt: **Configure -> Convert to Maven Project** Prawym klawiszem na diagramie w drzewie projektu wybieramy: **Activiti->Generate unit test**.\\ W ''src/test/java/org/activiti/designer/test'' powinien pojawić się nasz JUnit test. Proszę uruchomić JUnit test i sprawdzić, czy test przeszedł poprawnie. Gdyby test nie przeszedł poprawnie, bo np. nie wszystkie biblioteki udało się załadować:\\ Proszę dostosować odpowiednią wersję Activiti do uruchomionej na komputerze.\\ W tym celu należy zmieniamy w pliku ''pom.xml'' wersję Actviti na 5.XX (gdzie XX to odpowiednia wersja).\\ Obejrzyj również plik konfiguracyjny opisujący tryb działania Activiti ''activiti.cfg.xml'', powinien być w katalogu: ''src/main/resources/''.\\ Używając [[http://activiti.org/javadocs/org/activiti/engine/test/ActivitiRule.html|ActivitiRule]] mamy dostęp do odpowiednich serwisów zapewniających interfejsy do różnych funkcjonalności: * **[[http://www.activiti.org/javadocs/org/activiti/engine/RepositoryService.html|RepositoryService]]** -- zapewnia funkcjonalność do wdrażania, wykonywania zapytań, czy usuwania procesów, * **[[http://www.activiti.org/javadocs/org/activiti/engine/RuntimeService.html|RuntimeService]]** -- zapewnia interfejs do uruchamiania i wykonywania zapytań do instancji procesów (również ich zmiennych), * **[[http://www.activiti.org/javadocs/org/activiti/engine/IdentityService.html|IdentityService]]** -- zapewnia interfejs do autentykacji. * **[[http://activiti.org/javadocs/org/activiti/engine/TaskService.html|TaskService]]** -- zapewnia interfejs do zarządzania zadaniami. * **[[http://activiti.org/javadocs/org/activiti/engine/FormService.html|FormService]]** -- zapewnia interfejs do zarządzania formularzami. RepositoryService repositoryService = activitiRule.getRepositoryService(); RuntimeService runtimeService = activitiRule.getRuntimeService(); IdentityService identityService = activitiRule.getIdentityService(); TaskService taskService = activitiRule.getTaskService(); FormService formService = activitiRule.getFormService(); ===== Rozszerzenie testu ===== Przy użyciu interfejsu dostępnego poprzez ''TaskService'' oraz ''FormService'' proszę przetestować model z poprzednich zajęć (jak poniżej, ew. bez zdarzenia czasowego) dla dwóch scenariuszy (wybór każdej ze ścieżek po bramie XOR). {{:pl:dydaktyka:bim:lab2:process5-eclipse-example.png?800|}} Przydatne fragmenty kodu: * autentykacja użytkownika (w tym wypadku: kermit): identityService.setAuthenticatedUserId("kermit"); * interfejs do pobrania listy zadań dla określonego użytkownika: List taskList = taskService.createTaskQuery().processInstanceId(arg0).taskAssignee(arg0).list() * jeśli zadanie zostało ukończone prawidłowo, możemy wywołać: taskService.complete(arg0); * interfejs do przeglądania formularzy: FormService formService = processEngine.getFormService(); TaskFormData taskFormData = formService.getTaskFormData(taskList.get(0).getId()); List formList = taskFormData.getFormProperties(); Więcej informacji dostarczy [[http://activiti.org/javadocs/|Activiti API]]. ===== Uruchamianie modelu ===== Na bazie kodu używanego w testach możemy również napisać prosty program, który uruchomi silnik procesowy dla określonego procesu. W samodzielnej aplikacji można utworzyć silnik procesowy przy użyciu: ProcessEngine processEngine = pc.buildProcessEngine(); i następnie tak jak poprzednio mieć dostęp do odpowiednich serwisów zapewniających interfejsy do różnych funkcjonalności: import java.util.*; import org.activiti.engine.*; import org.activiti.engine.runtime.ProcessInstance; public class OfferProcessingExecution { public static void main(String [] args) { ProcessEngineConfiguration pc = ProcessEngineConfiguration .createStandaloneInMemProcessEngineConfiguration(); ProcessEngine processEngine = pc.buildProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); RuntimeService runtimeService = processEngine.getRuntimeService(); IdentityService identityService = processEngine.getIdentityService(); repositoryService.createDeployment() .addClasspathResource("diagrams/nazwa.bpmn20.xml") /* nazwa pliku */ .deploy(); Map variableMap = new HashMap(); variableMap.put("descriptionType", "short"); ... identityService.setAuthenticatedUserId("kermit"); ProcessInstance processInstance = /* podac id procesu z diagramu */ runtimeService.startProcessInstanceByKey("process-id", variableMap); System.out.println("process instance id: " + processInstance.getId()); } } Proszę zapoznać się z [[http://activiti.org/javadocs/|Activiti Engine API]] i rozbudować aplikację do obsługi procesu. Jedną z możliwości jest np. uruchomienie naszego procesu z ustawionymi parametrami, jak w jUnit teście, ale w trakcie działania w konsoli w odpowiednim momencie zapytanie o zmienną ''Specifications details'', następnie ustawienie tej wartości jako zmiennej procesu (do ustawienia wartości można użyć funkcji: [[http://activiti.org/javadocs/org/activiti/engine/RuntimeService.html#setVariable%28java.lang.String,%20java.lang.String,%20java.lang.Object%29|RuntimeService.setVariable]]). Przykład działania takiej aplikacji: {{:pl:dydaktyka:bim:lab2:eclipse-execution-example.png|}}