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