Spis treści


http://javadoc.plusworkflow.pl/javadoc/plusworkflow/latest

Wstęp

API Systemu PlusWorkflow udostępnia zbiór interfejsów i klas umożliwiających wykonywanie operacji systemowych. Najważniejszymi elementami API są usługi (Service) i klasy wyszukujące (Finder). Dostęp do tych elementów uzyskujemy poprzez klasy ServiceFactory oraz FinderFactory. Przykłady:

UserService us=ServiceFactory.getUserService();
ActivityService as=ServiceFactory.getActivityService();
UserFinder uf=FinderFactory.getUserFinder();
PositionFinder pf=FinderFactory.getPositionFinder();

Gdy mamy stworzoną instancję klasy Service możemy wykonywać dowolne operacje. Lista dostępnych serwisów jest dostępna tutaj: Lista dostępnych serwisów

Przykłady użycia usług

 		UserService us=ServiceFactory.getUserService(); 
        User user = new User("jkowalski","haslo");
        user.setFirstName("Jan");
        user.setLastName("Kowalski");
        us.createUser( user , "Pracownicy");

 

UserService us=ServiceFactory.getUserService(); 
User user = us.getUser("jkowalski");

Pobieranie powiązanych obiektów

Większość obiektów w systemie ma powiązania z innymi obiektami. Powiązania te obrazują schemat bazy danych. W większości przypadków obiekt podstawowy np. User, Position itd., znajduje się w osobnej tabeli bazy danych dlatego obiekty powiązane nie są domyślnie pobierane, aby zminimalizować czas wykonywania zapytania. Aby umożliwić pobieranie obiektów powiązanych metody służące do pobierania danych tj. get(), getAll(),getBy,,,() są wyposażone w parametr 'joins', określający które elementy mają zostać dołączone do pobieranego obiektu. Każda klasa podstawowa ma zdefiniowane stałe statyczne, których możemy użyć jako wartości parametru 'joins'. Argument  'joins' możemy ustawiać przekazując do funkcji tablicę lub listę wartości oddzielonych przecinkiem (parametr jest typu String). Przykłady:

 

User user = service.getUser( "jkowalski", User.JOIN_GROUPS );
for ( UserGroup ug : user.getGroups() )
{
   log.debug( ug.getName() );
}


Gdyby w funkcji getUser nie przekazano parametru 'joins' to podczas odwołania do pola 'groups' klasy User wystąpiłby wyjątek LazyInitializationException(chyba, ze w momencie odwołania do pola 'groups' istnieje otwarta transakcja).

 

User user = service.getUser( "jkowalski", User.JOIN_GROUPS, User.JOIN_POSITIONS, User.JOIN_OU );
Set<UserGroup> groups=user.getGroups();
Set<Position> positions=user.getPositions();
for ( Position position : positions )
{
   log.debug( position.getOrganizationalUnit().getName() );
}
 

Jak widać na powyższym przykładzie możemy pobierać obiekty powiązane pośrednio. W przykładzie pobieramy stanowiska użytkownika i dla każdego stanowiska pobieramy również jednostkę organizacyjną.

 

Tak naprawdę w celu dołączenia obiektów powiązanych nie musimy korzystać z pól statycznych tj. User.JOIN_GROUPS, ponieważ pod nimi kryje się zwykły ciąg znaków zawierający pola klasy, które mają zostać dołączone podczas pobierania. Musimy pamiętać, aby dołączyć również wszystkie pola pośrednie. Spójrzmy na przykład:

User user = service.getByUserId( "jkowalski", "positions", "positions.organizationalUnit", "positions.organizationalUnit.directorPosition","positions.organizationalUnit.directorPosition.roles" );

Powyższe zapytanie pobierze użytkownika o loginie 'jkowalski', dołączy stanowiska, do stanowiska dołączy jednostkę, do jednostki dołączy stanowisko kierownicze i dla tego stanowiska dołączy również role. Dzięki temu możemy wykonać np. następujący kod:

  for ( Position p : user.getPositions() )
            {
                if ( p.getOrganizationalUnit() != null )
                {
                    if ( p.getOrganizationalUnit().getDirectorPosition() != null )
                    {
                        for ( PositionRole pr : p.getOrganizationalUnit().getDirectorPosition().getRoles() )
                        {
                            log.debug( pr.getRoleId() );
                        }
                    }
                }
            }

Oczywiście tak złożone zapytanie poza tym, że raczej nie ma większego sensu, nie jest zalecane z uwagi na stosunkowo długi czas wykonywania.

Używanie pól statycznych do dołączania obiektów jest zalecane, ponieważ eliminuje możliwość popełnienia błędu (literówki).