Funkcje pozwalają na deklaratywne przetwarzanie danych bez konieczności pisania własnego kodu. Rozwiązanie to opiera się na wywoływaniu wybranej funkcji (użytkownicy mogą dostarczać własne specyficzne implementacje) i przekazaniu wyniku tej funkcji dalej np. do zadania automatycznego. W przypadku podstawowych działań matematycznych, kwotowych, tekstowych czy logicznych możliwe jest zrealizowanie prostych przekształceń bez napisania linijki kodu.
Wykorzystanie funkcji możliwe jest w następujących obszarach:
- Komponenty obiegu dokumentów (np. akcje, walidatory, zadania automatyczne)
- w wartościach parametrów
Tworzone funkcje powinny być ja najbardziej ogólne i elastyczne. Pozwoli to na wykorzystanie ich w większej liczbie przypadków. System pozwala na rejestrowanie i wykorzystywanie predefiniowanych funkcji zarówno po stronie serwera jak i po stronie przeglądarki.
Spis wbudowanych funkcji systemowych dostępny jest na stronie: Spis dostępnych funkcji
FunctionAPI
Wszystkie operacje związane z działaniami na funkcjach stanowią FunctionAPI.
Rejestracja funkcji
Rejestracja na serwerze
Rejestracja funkcji dostępnych w systemie odbywa się podczas uruchomienia systemu oraz dynamicznie dla dynamicznych zasobów, takich jak wtyczki. Za rejestrację i przechowywanie funkcji odpowiada FunctionRegistry. Podczas rejestracji wyszukiwane są najpierw wszystkie klasy oznaczone adnotacją @Functions, następnie w tych klasach wyszukiwane są metody oznaczone adnotacją @Function i zostają one zarejestrowane jako funkcje.
Poniższy przykład przedstawia definicję prostej funkcji zwracającej wartość wyższej liczby.
@Functions public class BasicFunctions { @Function public Integer maxOf( Integer a, Integer b ) { return Math.max( a, b ); } }
Zarejestrowana funkcja posiada nazwę, zwracany typ oraz definicję parametrów -> Function.
Rejestracja po stronie przeglądarki
Używanie stworzonej funkcji po stronie przeglądarki (na formularzu zadania) wymaga od programisty dostarczenia jej implementacji w języku JavaScript. Taka implementacja wykorzystywana jest podczas dynamicznych obliczeń po stronie przeglądarki klienta.
Funkcje rejestrowane są z wykorzystaniem API PW.fn.Functions (skrócona nazwa PW.Functions
):
// funkcja "max" która zwraca obiekt typu "float" i przyjmuje 2 parametry typu "float" PW.Functions.register("max", "float", ["float", "float"], function(value1, value2){ return Math.max(value1, value2); }); // funkcja "upper" która zwraca obiekt typu "string" i przyjmuje 1 parametry typu "string" PW.Functions.register("i[[er", "float", ["float"], function(text){ return text.toUpperCase(); });
Podczas rejestracji funkcji niezbędne jest zdefiniowanie:
- nazwy (można zarejestrować wiele funkcji o tej samej nazwie ale musza mieć one inne typy parametrów)
- typu zwracanej wartości
- typów parametrów
- implementacji funkcji
Tak zarejestrowana funkcja zostanie wywołana tylko dla wywołań z argumentami które będą pasowały do zdefiniowanych typów (albo będą tego samego typu albo mogą zostać przekonwertowane).
Oczywiście tak przygotowany skrypt musi zostać wstrzyknięty w obszar formularza zadania. Więcej o wstrzykiwaniu skryptów tutaj.
Rejestracja we wtyczce
Rejestracja funkcji we wtyczce jest taka sama jak zostało to opisane powyżej, jednak należy dodatkowo zaznaczyć, że wtyczka ta udostępnia funkcje do zarejestrowania. W tym celu należy w pliku suncode-plugin.xml dodać wpis:
<functions key="functions" />
Taki wpis spowoduje automatyczne wyszukanie wszystkich zdefiniowanych we wtyczce funkcji.