Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 13 Next »

Spis treści


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:

Pobieranie usług
UserService us=ServiceFactory.getUserService();
ActivityService as=ServiceFactory.getActivityService();
Pobieranie klas wyszukujących
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

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

 

Pobranie użytkownika (UserService)
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:

 

Pobranie użytkownika i jego grup (UserService)
User user = service.getUser( "jkowalski", User.JOIN_GROUPS );
for ( UserGroup ug : user.getGroups() )
{
   log.debug( ug.getName() );
}


Uwaga

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).

 

Pobranie wielu obiektów powiązanych (UserService)
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ą.

 

Zaawansowane dołączanie obiektów

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).



  • No labels