Przydatne linki
Zadanie zaplanowane
Zadanie zaplanowane to komponent użytkownika pozwalający na zdefiniowanie zadania wykonywanego okresowo.
Stworzenie zadania zaplanowanego możliwe jest w panelu administratora (Administracja -> Konfiguracja systemu -> Zadania zaplanowane)
Definiowanie zadania zaplanowanego
Zadanie zaplanowane tworzone jest w oparciu o definicję stworzoną przez użytkownika. Definicja taka musi zawierać następujące elementy:
- Adnotację @ScheduledTask (jeżeli zadanie zaplanowane nie jest definiowane we wtyczce, musi ono pochodzić z pakietu
com.suncode
) - Publiczną metodę oznaczoną adnotacją @Define z jednym parametrem ScheduledTaskDefinitionBuilder
- Publiczną metodę o nazwie execute, która ma zostać wykonana okresowo. Metoda execute może zwracać dowolny typ włącznie z void. Zwrócona wartość będzie wyświetlona jako wynik przetwarzania zadania zaplanowanego. Ustawienie typu void jest jednoznaczne z brakiem rezultatu.
Definicja może zawierać również adnotację @ScheduledTaskScript. Adnotacja ta przekazuje ścieżkę do skryptu (z classpath) zawierającego definicję formularza dynamicznego.
Przykładowa definicja przedstawiona jest poniżej:
@ScheduledTask @ScheduledTaskScript( "js/example-form.js" ) public class ExampleScheduledTask { @Define public void definition( ScheduledTaskDefinitionBuilder builder ) { builder .id( "example-scheduled-task" ) .name( "example.scheduled.task.name" ) .description( "example.scheduled.task.desc" ) .cancelable() .parameter() .id( "scheduled-task-param" ) .name( "example.scheduled.task.param.name" ) .description( "example.scheduled.task.param.desc" ) .type( Types.STRING ) .create(); } public void execute( @Param( value = "scheduled-task-param" ) String param ) { // Ciało zadania zaplanowanego ... } }
Implementacja metody execute
Zadanie zaplanowane musi posiadać metodę o nazwie execute. Metoda może posiadać następujące typy parametrów:
- pojedynczy parametr zadania zaplanowanego - typ parametru musi być zgodny ze zdefiniowanym typem oraz musi być poprzedzony adnotacją @Param. Obsługiwane typy parametrów:
- STRING
- BOOLEAN
- INTEGER
- FLOAT
- DATE - mapowane do org.joda.time.LocalDate (format yyyy-MM-dd)
- DATETIME - mapowane do org.joda.time.LocalDateTime (format yyyy-MM-dd HH:mm:ss)
- FILE - mapowanie do com.suncode.pwfl.customfile.CustomFile
- STRING_ARRAY
- BOOLEAN_ARRAY
- INTEGER_ARRAY
- FLOAT_ARRAY
- DATE_ARRAY
- DATETIME_ARRAY
- FILE_ARRAY
- Parameters - zawiera wszystkie zdefiniowane parametry zadania zaplanowanego wraz z ich wartościami, jest to alternatywa dla pobierania parametru za pomocą wyżej wspomnianej adnotacji @Param,
- Translator - translator dla tego komponentu. Więcej informacji tutaj,
- CancelationHandler - przechowuje informację o tym, czy użytkownik w GUI kliknął przycisk Anuluj wykonywanie. Sam mechanizm anulowania zadania musi zaimplementować twórca komponentu. Przycisk Anuluj wykonywanie pokaże się tylko, jeżeli w builderze została wywołana metoda cancelable,
- Logger - logger do logowania własnych komunikatów w komponencie. Komunikaty są zapisywane do plików (skonfigurowanych w Log4j) oraz zostaną wyświetlone w historii wykonywania zadania.
- ProgressHolder - obiekt, w którym ustawić można aktualny progress wykonywania zadania zaplanowanego (liczba między 0 a 1). Progress ten zostanie wyświetlony w GUI.
- ScheduledTaskInstanceInfo - obiekt przechowujący informacje o danej instancji zadania zaplanowanego.
Rejestracja zadania zaplanowanego we wtyczce
Jeżeli zadanie zaplanowane jest definiowane we wtyczce to należy dodatkowo zaznaczyć, że wtyczka ta udostępnia komponenty. W tym celu należy w pliku suncode-plugin.xml dodać wpis:
<!-- Udostępnianie komponentów (m.in. zadań zaplanowanych) --> <workflow-components key="components" />
Metoda jako zadanie zaplanowane we wtyczce
Zadanie zaplanowane we wtyczce nie musi być komponentem. Może zostać stworzone tak samo, jak zadania zaplanowane definiowane w projektach klienckich - zadanie zaplanowane jako wywołanie publicznej metody.
Np. po stworzeniu klasy we wtyczce:
package com.suncode.plugin; public class SomePluginClass { public void someMethod( String text, Integer number ) { System.out.println( "Text: " + text + ", number: " + number ); } public void someMethod2( String text, Double number ) { System.out.println( "Text: " + text + ", number: " + number ); } }
Po wpisaniu com.suncode.plugin.SomePluginClass w pole Nazwa klasy w oknie dodawania nowego zadania zaplanowanego wyświetlone zostaną metody someMethod oraz someMethod2, które można wybrać i dodać jako zadanie zaplanowane.
Takie zadania mają jednak ograniczenia:
- nie można użyć adnotacji AdvancedTask do nadania nazwy, opisu itd. dla zadania zaplanowanego
- nie można przerwać takiego zadania
- nie można ustawić progresu dla takiego zadania
- nie można logować
Ze względu na powyższe ograniczenia funkcjonalność ta powinna służyć jedynie do testowania własnych klas we wtyczkach. Preferowane jest, aby docelowo zadania zaplanowane we wtyczkach były komponentami.
UWAGA
Jeśli zadanie zaplanowane jest napisane jako rozszerzenie klasy AbstractAdvancedTask i ma włączoną adnotację cancelable = true to by przerwać wykonywanie takiego zadania należy w kodzie metody dodać warunek:
if (Thread.currentThread().isInterrupted()) { taskLog.info( "Anulowano...."); log.info( "Anulowano...."); break; }
Dynamiczny formularz
Dynamiczny formularz umożliwia zdefiniowanie formularza parametrów zadania zaplanowanego.
Rejestracja dynamicznego formularza
PW.ScheduledTasks.register('example-scheduled-task', { buildParams: function (form) { form.addCombobox({ id: 'example-scheduled-task', values: [ ['wartosc1', 'Wartosc 1'], ['wartosc2', 'Wartosc 2'], ['wartosc3', 'Wartosc 3'] ] }); } }
Jeżeli podczas dodawania elementu do formularza zdefiniujemy mu id i ta wartość będzie odnosić się do id parametru zdefiniowanego w komponencie, to wszystkie właściwości dla pola zostaną odczytane z definicji parametru (nazwa, opis, wymagalność, typ).
Jeżeli natomiast chcemy dodać pole, które nie jest związane z żadnym parametrem (nie będzie ono zapisane w deklaracji źródła), to powinniśmy określić nazwę, opis, typ oraz wymagalność.
Dostępne funkcje dynamicznego formularza
Funkcja | Parametry | Opis |
---|---|---|
addField(definition, [position]) | definition - identyfikator dodawanego parametru lub obiekt zawierający definicję pola position - pozycja na której dodany mam zostać parametr. Gdy position nie zostanie podany, parametr zostanie dodany na końcu formularza. | Dodanie parametru. Przykład: ... form.addField('param-1'); ... Jeżeli dodajemy pole niezwiązane z parametrem komponentu, to możemy określić jakiego typu ma być to pole. Dostępne są następujące typy: string, integer, float, date, datetime, boolean, string[], integer[], float[], date[], datetime[], boolean[]. ... form.addField({ id: 'custom', fieldType: 'date', ... }); ... |
addTextArea(definition, [position]) | definition - identyfikator dodawanego parametru lub obiekt zawierający definicję pola position - pozycja na której dodany mam zostać parametr. Gdy position nie zostanie podany, parametr zostanie dodany na końcu formularza. | Dodanie parametru jako pole typu `TextArea`. Parametr musi być typu String.
Przykład: ... form.addTextArea('param-1'); ... lub ... form.addTextArea({ id: 'param-1', ... }); ... |
addCombobox(definition, [position]) | definition - obiekt zawierający definicję pola Definicja powinna zawierać nastepujące pola:
position - pozycja na której dodany mam zostać parametr. Gdy position nie zostanie podany, parametr zostanie dodany na końcu formularza
| Dodanie parametru jako pole typu `Combobox`. Przykład dodania pola typu 'Combobox' lokalnego (local): ... form.addCombobox({ id: 'param-1', values : [ ['activity', 'Zadanie'], ['stage', 'Etap'], ['process', 'Proces'] ], sort: [{ field: 'display', direction: 'DESC' }], onChange: function(combo, newValue, oldValue){ ... } }); ... Przykład dodania pola typu 'Combobox' zdalnego (remote): ... form.addCombobox({ id: 'param-1', valueField: 'id', displayField: 'display', remote: { url: Suncode.getAbsolutePath('plugin/com.suncode.example-plugin/example-combo/get'), remoteSort: false, pageSize: 20 }, sort: [{ property: 'display', direction: 'DESC' }], onChange: function(combo, newValue, oldValue){ ... } }); ... |
addCheckbox(definition, [position]) | definition - identyfikator dodawanego parametru lub obiekt zawierający definicję pola position - pozycja na której dodany mam zostać parametr. Gdy position nie zostanie podany, parametr zostanie dodany na końcu formularza. | Przykład: ... form.addCheckbox('param-1'); ... Jeżeli podpinamy to pod parametr komponentu, to typ tego parametru musi być boolean. |
addRow( [definition] ) | definition - definicja wiersza. Zawiera następujące pola:
| Dodaje i zwraca "pusty" wiersz. Zwrócony wiersz umożliwia dodanie do niego pol. Pola będą dodawane obok siebie. Przykład: var row = form.addRow(); row.addField('param-1'); row.addField('param-2'); row.addCombobox(...); |
addButton(definition, [position] ) | definition - definicja przycisku.
position - pozycja na której dodany mam zostać parametr. Gdy position nie zostanie podany, parametr zostanie dodany na końcu formularza | Dodanie przycisku na formularzu. Przykład: form.addButton({ id: 'btn-1', text: 'Przycisk', handler: function(){ ... } }) |
addPassword(definition, [position] ) | definition - identyfikator dodawanego parametru lub obiekt zawierający definicję pola position - pozycja na której dodany mam zostać parametr. Gdy position nie zostanie podany, parametr zostanie dodany na końcu formularza. | Dodanie parametru jako pole typu 'Password'. Parametr musi być typu String. Przykład: ... form.addPassword('param-1'); ... lub ... form.addPassword({ id: 'param-1', ... }); ... |
hide(elementId) | elementId - identyfikator elementu | Ukrywa pole o podanym id. Przykład ... form.hide('param-1'); ... |
show(elementId) | elementId - identyfikator elementu | Pokazuje pole o podanym id. Przykład: ... form.show('param-1'); ... |
disable(elementId) | elementId - identyfikator elementu | Wyłącza możliwość edycji pola o podanym id. Przykład: ... form.disable('param-1'); ... |
enable(elementId) | elementId - identyfikator elementu | Włącza możliwość edycji pola o podanym id. Przykład: ... form.enable('param-1'); ... |
getValue(elementId) | elementId - identyfikator elementu | Pobiera wartość parametru o podanym id. Przykład: ... form.getValue('param-1'); ... |
setValue(elementId, value) | elementId - identyfikator elementu value - wartość do ustawienia | Ustawia przekazaną wartość do parametru o podanym id. Dla typów tablicowych wartością jest tablica wartości. Przykład: ... form.setValue('param-1', 'value'); ... |
mask(onlyForm) | onlyForm - prawda by nałożyć maskę tylko na formularz parametrów, fałsz by nałożyć maskę na zawartość całego okna. | Nakłada maskę na formularz parametrów lub zawartość okna. Przykład: ... form.mask(false); ... |
unmask(onlyForm) | onlyForm - prawda by usunąć maskę tylko z formularza parametrów, fałsz by usunąć maskę z zawartości całego okna | Usuwa maskę z formularza parametrów lub zawartości okna. Przykład: ... form.unmask(false); ... |