AgE 2.4 : Komponenty oparte o deskyproty XMLowe

Kontrakty komponentów

Kontrakty XML zrealizowali w ramach przedmiotu "Technologie Komponentowe":

  • Tomasz Łukasik
  • Marek Mierzwa

Uwaga: Kontrakty XMLowe dostępne są od wersji 2.4.0.

Kontrakty oparte na plikach XML zostały wprowadzone do jAgE w odpowiedzi na dwie potrzeby:

  1. Adaptowanie komponentów niedostosowanych do użycia w jAgE – nie implementujących interfejsu IPropertyContainer.
  2. Weryfikacja poprawności konfiguracji startowej.

Aktualnie zrealizowana jest w większości pierwsza potrzeba.
Możliwe jest instancjonowanie obiektów komponentu zewnętrznego, który nie implementuje interfejsu IPropertyContainer,
w taki sam sposób jak komponentu implemenującego ów interfejs, pod warunkiem posiadania pliku XML ze specjalnym jego opisem.

Sposób działania

Aby móc zaadoptować zewnętrzny komponent należy zdefiniować dla niego plik XML ze specjalnym opisem.
W opisie tym należy zawrzeć informacje o

  • rozszerzanych komponentach,
  • implementowanych interfejsach,
  • ewentualnych zależnościach od innych komponentów,
  • (co najważniejsze) o właściwościach danego komponentu.

Plik XML z kontraktem musi znajdować się w tym samym pakiecie co opisywany komponent. Nie znaczy to, że musi znajdować się w tym samym katalogu, np. klasa znajduje się w katalogu src/java w pakiecie org.jage.component, natomiast kontrakt w src/resources w pakiecie org.jage.component. Plik powinien mieć następującą nazwę <NazwaKlasy>.contract.xml.Opis przykładowego kontraktu xml można znaleźć w Opis pliku kontraktu .

Po przygotowaniu pliku kontraktu, komponenty zewnętrzne można instancjonować bardzo podobnie jak komponenty implementujące IPropertyContainer. W metodzie createInstance() klasy ComponentDefinition została dodana funkcjonalność. W sytuacji gdy należy zinstancjonować komponent zewnętrzny, podejmowana jest próba tymczasowego zaadaptowania go i zainicjalizowania na tej samej zasadzie co komponeny jAgE'a. Jeśli poprawnie zdefiniowano kontrakt, próba taka powinna się powieść, a w jej wyniku powstaje zainicjalizowany komponent.

Aktualnie adapter istnieje tylko na etapie inicjalizacji. Po inicjalizacji komponentu, adapter zostaje porzucony i nie jest możliwe korzystanie z obiektu komponentu w taki sposób jak z obiektów IPropertyContainer.

Prawdopodobnie w niedalekiej przyszłości zostaną wprowadzone zmiany pozwalające na lepsze wykorzystanie adaptera.