h3. Agregat
Agregat to specjalny rodzaj agenta, mogący „posiadać” innych agentów. Agregat zarządza działaniem posiadanych agentów, umożliwia im komunikację i migrację. Każdy agregat może posiadać agentów tylko określonego typu.
Obecnie jedyną implementacją interfejsu IAggregate jest SimpleAggregate, który zarządza agentami prostymi (typu SimpleAgent). Poprawność typu agenta przekazywanego do agregatu jest zapewniona poprzez mechanizm adnotacji (w odróżnieniu do wersji 2.1, w której typ dopuszczalnych agentów zwracany był w metodzie getSupportedAgentClasses). W stosunku do wersji 2.1 została zmieniony również został sposób przechowywania agentów. Obecnie agregat jest kolekcją języka Java.
Wewnętrznie agenci przechowywani są w agregacie w strukturze HashMap. W poprzedniej wersji struktura ta była typu HashTable, która jest wewnętrznie synchronizowana. Obecnie mapa z agentami synchronizowana jest zewnętrznie z użyciem obiektu klasy ReaderWriterLock, dlatego wewnętrzna synchronizacja nie jest już konieczna.
Agregat implementuje wszystkie metody interfejsu Collection, przy czym implementacja większości z nich jest delegacją do odpowiadających metod obiektu HashMap przechowującego agentów. Wyjątkiem są metody add(IAgent agent) oraz remove(Object o), które poza dodaniem (usunięciem) ustawiają odpowiednią wartość pola agentEnvironment agenta (referencję do danego agregata w przypadku dodawania oraz null w przypadku usuwania agenta).
Agregat jest kontenerem przchowującym agentów oraz zapewnia im lokalne środowisko obliczeniowe. W ten sposób można rozróżnić w agregacie metody odpowiedzialne za obie te funcjonalności. Poniżej przedstawiono diagramy klas uwzględniające rozbicie na obie funcje. Pierwszy diagram prezentuje metody interfejsu Collection. Kolejny - metody odpowiedzialne za zapewnienie środowiska obliczeniowego.
Diagram 1
Diagram 2