Specyfikacja pliku konfiguracyjnego
Konfiguracja obliczenia dla platformy jAgE przechowywana jest w postaci pliku XML. Na niniejszej stronie znajduje się dokładna specyfikacja format pliku konfiguracyjnego utworzona na podstawie XML Schema dostępnej na http://age.iisg.agh.edu.pl/xsd/age-2.3.xsd. Każdy plik konfiguracyjny powinien zawierać preambułę określającą lokalizację XML schema oraz domyślny namespace:
<?xml version="1.0" encoding="UTF-8"?> <configuration xmlns="http://age.iisg.agh.edu.pl/AgE/2.5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://age.iisg.agh.edu.pl/AgE/2.5 http://age.iisg.agh.edu.pl/xsd/age-2.5.xsd"> ... </configuration>
Poniższa tabela zawiera spis wszystkich możliwych tagów:
Indeks hierarchiczny |
Indeks alfabetyczny |
|---|---|
|
|
Opis znaczników
constructor-arg
Elementy <constructor-arg/> służą do określenia, jakie wartości należy przekazać do konstruktora obiektu. W przeciwieństwie do wszystkich innych elementów konfiguracji, kolejność zdefiniowania elementów <constructor-arg/> jest istotna, gdyż argumenty zostaną przekazane w takiej kolejności, w jakiej wystąpiły w konfiguracji. Podobnie jak w przypadku <property/>, jedynym elementem potomnym musi być element <value/> lub <reference/>.
include
The <include/> element can be used to insert another XML document in the place it is located. It allows to split a single configuration into many files. It has one required attribute: file that defines a name of the XML resource to load. The content of the root element (<configuration/>) of the pointed document is inserted in the place of the <include/> and not the root element itself.
Atrybut |
Wymagany |
Typ |
Opis |
|---|---|---|---|
file |
Yes |
|
A URI of the resource to include. Allowed protocols are: |
Example:
<configuration> <include file="file:agents.xml"/> </configuration>
The case when <include/> elements create a cycle (e.g. in a file A.xml exists an element: <include file="B.xml"/>, and in the file B.xml: <include file="A.xml"/>) is forbidden and will result in StackOverflowException or OutOfMemoryException.
list
Element <list/> jest definicją listy obiektów dowolnego typu.
Atrybut |
Wymagany |
Typ |
Opis |
|---|---|---|---|
|
Tak |
|
Nazwa definiowanego komponentu |
|
No |
|
A type of items in the list ( |
|
Nie(Domyślnie false) |
|
Flaga informująca czy dany komponent jest reprezentowany jako obiekt singleton |
Elementami potomnymi mogą być <value/> oraz <reference/>, które określają, jakie obiekty ma zawierać lista, a także definicje innych obiektów.
Przykład definicji listy wypełnionej 10 obiektami (4 obiekty object1, 5 obiektów object2 i jeden obiekt object3):
<list name="myList" type="org.example.MyClass"> <reference target="object1" count="4"/> <reference target="object2" count="5"/> <reference target="object3"/> </list>
array
The <array/> element defines an Java array of any type.
Attribute |
Required |
Type |
Description |
|---|---|---|---|
|
Yes |
|
A name of the defined component. |
|
Yes |
|
A component type of the defined array. |
|
No (Default: false) |
|
A flag that describes whether the component is represented as a singleton object. |
Allowed children components of the <array/> can be both <value/> and <reference/> that describes what objects the array will contain. Definitions of other components are also allowed.
An example of the definition of a llist that contains 3 objects of type java.lang.Long:
<array name="long-example" type="Long"> <value class="Long" value="2" /> <value class="Long" value="4" /> <value class="Long" value="8" /> </array>
map
Element <map/> jest definicją słownika obiektów dowolnego typu. Tak jak w przypadku list oraz zbiorów, element ten musi posiadać atrybut name oraz może posiadać atrybut isSingleton. Elementami potomnymi mogą być wyłącznie definicje innych obiektów i strategii lub elementy <item/>, określające obiekty wstawiane do słownika. Każdy z nich musi zawierać element <itemKey/>, określający klucz elementu listy, oraz <itemValue/>, określający wartość tego elementu.
Atrybut |
Wymagany |
Typ |
Opis |
|---|---|---|---|
|
Tak |
|
Nazwa definiowanego komponentu |
|
No |
|
A type of keys in the map ( |
|
No |
|
A type of values in the map ( |
|
Nie(Domyślnie false) |
|
Flaga informująca czy dany komponent jest reprezentowany jako obiekt singleton |
Przykład dwuelementowej mapy:
<map name="myMap" isSingleton="true" keyType="java.lang.String" valueType="org.example.MyClass">
<item>
<itemKey><value class="String" value="2"/></itemKey>
<itemValue><reference target="innerObject2"/></itemValue>
</item>
<item>
<itemKey><value class="String" value="1"/></itemKey>
<itemValue><reference target="innerObject1"/></itemValue>
</item>
</map>
component
Element <component/> jest definicją komponentu reprezentowanego przez obiekt dowolnego typu. Może on posiadać trzy atrybuty:
Atrybut |
Wymagany |
Typ |
Opis |
|---|---|---|---|
|
Tak |
|
Nazwa definiowanego komponentu |
|
Tak |
Poprawna nazwa klasy |
Nazwa klasy obiektu. W przypadku wykorzystania właściwości obiektów klasa ta musi implementować interfejs |
|
Nie(Domyślnie false) |
|
Flaga informująca czy dany komponent jest reprezentowany jako obiekt singleton |
Dopuszcza się następujące elementy potomne opisywanego elementu:
- Definicje innych komponentów (takie jak
<component/>,<list/>, itp.). Komponenty zdefiniowane we wnętrzu innego komponentu nie są widoczne poza swoim rodzicem, mogą jednak korzystać ze wszystkich komponentów, które są widoczne dla jakiegokolwiek z ich przodków w hierarchii. - Elementy
<property/>. - Elementy
<constructor-arg/>. - Elementy
<include/>.
Przykład definicji obiektu posiadającego trzy pola (a, b, list):
<component name="outerObject" class="org.jage.core.config.workplace.tests.ClassWithProperties" isSingleton="true">
<component name="innerObject1"
class="org.jage.core.config.workplace.tests.ClassWithProperties" isSingleton="false"/>
<constructor-arg><value class="String" value="ABC"/></constructor-arg>
<constructor-arg><value class="Integer" value="123"/></constructor-arg>
</component>
<list name="myList" isSingleton="true">
<reference target="innerObject1"/>
<reference target="innerObject1"/>
</list>
<property name="a"><value class="Integer" value="4"/></property>
<property name="b"><value class="Float" value="3.14"/></property>
<property name="list"><reference target="myList"/></property>
</component>
property
Element <property/> służy do ustawienia właściwości obiektu. Musi on posiadać atrybut name, określający nazwę właściwości. Jedynym elementem potomnym musi być element <value/> lub <reference/>, który definiuje przypisywaną wartość.
Atrybut |
Wymagany |
Typ |
Opis |
|---|---|---|---|
|
Tak |
|
Nazwa pola komponentu, do którego zostanie przypisana wartość. Nazwa ta pochodzi z kontraktu komponentu (w domyślnej implementacji opartej o mechanizm właściwości jest to nazwa zawarta w adnotacji |
reference
Element <reference/>, podobnie do elementu <value/>, jest używany do uzyskania pewnej wartości potrzebnej do stworzenia obiektu. Zwraca on referencję do innego zdefiniowanego w konfiguracji obiektu. Musi on posiadać pojedynczy atrybut target, który określa nazwę obiektu, do którego się odwołuje. Jeśli tag <reference/> definiuje elementy listy lub zbioru (patrz opis poniżej) może posidać opcjonalny atrybut count określający krotność opisywanych obiektów w kolekcji. Atrybut ten jest zabroniony jeśli element <reference/> występuje poza definicją kolekcji.
Atrybut |
Wymagany |
Typ |
Opis |
|---|---|---|---|
target |
Tak |
|
Określa nazwę komponentu, którego referencja ma zostać przypisana do danego pola lub dodana do kolekcji |
class |
Nie |
Poprawna nazwa klasy lub interfejsu |
TODO: ??? |
count |
Nie (tylko dla zbiorów i list) |
|
Określa liczbę obiektów reprezentujących komponent o danej nazwie, które mają być wstrzyknięte do kolekcji (zbioru lub listy) |
set
Element <set/> jest definicją zbioru obiektów dowolnego typu.
Atrybut |
Wymagany |
Typ |
Opis |
|---|---|---|---|
|
Tak |
|
Nazwa definiowanego komponentu |
|
No |
|
A type of items in the set ( |
|
Nie(Domyślnie false) |
|
Flaga informująca czy dany komponent jest reprezentowany jako obiekt singleton |
Elementami potomnymi mogą być <value/> oraz <reference/>, które określają, jakie obiekty ma zawierać zbiór, a także definicje innych obiektów.
Przykład definicji zbrioru zawierającego dwa obiekty typu String z wartościami "1" i "2":
<set name="mySet" type="org.example.MyClass">
<value class="String" value="2"/>
<value class="String" value="1"/>
</set>
agent
Element <agent/> opisuje pojedynczy typ agenta. Jest aliasem do elementu <component/> z atrybutem isSingleton ustawionym na false.
Wszystkie elementy potomne i atrybuty dostępne dla elementu <component/> mogą być również wykorzystane w elemencie <agent/>. Wyjątek stanowi atrybut isSingleton, którego użycie jest zabronione.
Atrybut |
Wymagany |
Typ |
Opis |
|---|---|---|---|
|
Tak |
|
Nazwa definiowanego komponentu |
|
Tak |
Poprawna nazwa klasy |
Nazwa klasy obiektu. W przypadku wykorzystania właściwości obiektów klasa ta musi implementować interfejs |
strategy
Element <strategy/> opisuje strategie, czyli komponenty reprezentowane przez obiekty o zasięgu singleton - jest równoznaczny elementowi <component/> z atrybutem isSingleton ustawioną na true. Wszystkie elementy potomne i atrybuty dostępne dla elementu <component/> mogą być również wykorzystane w elemencie <strategy/>. Wyjątek stanowi atrybut isSingleton, którego użycie jest zabronione.
Atrybut |
Wymagany |
Typ |
Opis |
|---|---|---|---|
|
Tak |
|
Nazwa definiowanego komponentu |
|
Tak |
Poprawna nazwa klasy |
Nazwa klasy obiektu. W przypadku wykorzystania właściwości obiektów klasa ta musi implementować interfejs |
Strategie mogą być definiowane na różnych poziomach w pliku konfiguracyjnym XML (co przekłada się w analogiczny sposób na hierarchię w modelu konfiguracji). Strategie (dot. to wszystkich komponentów - component) są dziedziczone w hierarchii modelu konfiguracyjnego, tzn:
- strategia jest widoczna (dostępna) tylko z poziomu, na którym jest zdefiniowana oraz na wszystkich poniższych poziomiach - w dół hierarchii (patrz przykład 2)
- nie można się odwołać do strategii, która jest zdefiniowana na niższym poziomie
- możliwe jest przesłanienia implementacji strategii tego samego typu - (patrz przykład 3)
Przykład 1 - definicja strategii
<strategy name="echo123Strategy" class="org.jage.app.example.strategy.Echo123Strategy"/>
Przykład 2 - dziedziczenie strategii
<configuration> <strategy name="strategiaNaPoziomie1" class="org.jage.sample.StrategyA" > <strategy name="strategiaNaPoziomie2" class="org.jage.sample.StrategyB" /> <component name="innerAgent" class="org.jage.sample.SampleAgent"> <property name="strategyA"><reference target="strategiaNaPoziomie1"</property> <property name="strategyB"><reference target="strategiaNaPoziomie2"</property> </component> </strategy> <component name="outerAgent" class="org.jage.sample.SampleAgent"> <property name="strategyA"><reference target="strategiaNaPoziomie1"</property> </component> </configuration>
Obiekt outerAgent ma dostęp jedynie do strategii typu StrategyA, która jest zdefiniowana na tym samym poziomie w konfiguracji. Natomiast obiekt innerAgent może posiadać zależności do obu strategii: zdefiniowanej na tym samym poziomie (StrategyB) oraz na wyższych poziomach (StrategyB).
Przykład 3 - przesłanianie strategii
<configuration> <strategy name="strategiaNaPoziomie1" class="org.jage.sample.SampleStrategyImplA" > <strategy name="strategiaNaPoziomie2" class="org.jage.sample.SampleStrategyImplB" /> <component name="innerAgent" class="org.jage.sample.SampleAgent" /> </strategy> <component name="outerAgent" class="org.jage.sample.SampleAgent"> </configuration>
Zakłada się, że obiekty typu SampleAgent posiadają zależność od strategii typu ISampleStrategy. Natomiast klasy SampleStrategyImplA oraz SampleStrategyImplB są implementacjami interfejsu ISampleStrategy.
W tym przypadku obiekt outerAgent będzie posiadał wskazanie na obiekt typu SampleStrategyImplA ponieważ jest on jedyną widoczną implementacją. Natomiast z poprzedniego przykładu wynika, że obiekt innerAgent ma dostęp do obu strategii. Ponieważ są one tego samego typu, to do obiektu innerAgent jest wstrzykiwany obiekt typu, który zarejestrowany najbliżej w hierarchii (idąc w górę).
value
Element <value/> jest używany do uzyskania pewnej wartości potrzebnej do stworzenia obiektu i za jego pomocą można określić konkretną wartość jednego z kilku typów prostych. Musi on posiadać dwa atrybuty: class, określający typ wartości, oraz value, zawierający zakodowaną w postaci łańcucha tekstowego wartość.
Atrybut |
Wymagany |
Typ |
Opis |
|---|---|---|---|
class |
Tak |
Dopuszczalne wartości: |
Klasa określająca typ wartości prostej. |
value |
Tak |
Wartość odpowiednia dla wybranego typu prostego. |
Wartość typu prostego. |