Projet

Général

Profil

Actions

SpeADL Reference » Historique » Révision 22

« Précédent | Révision 22/34 (diff) | Suivant »
Anonyme, 10/10/2014 13:22


SpeADL Full Reference

ATTENTION: DRAFT Document

In SpeADL, a set of abstractions are provided to describe typical component-oriented architectures.
On top of these, SpeADL introduces additional abstractions that complete them in order to describe dynamic architectures, in particular for Multi-Agent Systems.
The motivations behind these abstractions are fully discussed in the Ph.D. thesis that led to the creation of MAY, here we stay at the user level.

The main idea with these abstractions is to define software components, called ecosystems, that are able to dynamically create other software components, called species, and to link such components to their ecosystem in a safe and controlled manner.
For example, one could define a Bank component containing a Database and that creates Account component which themselves requires access to the Database.
Or one could define a MAS component that creates Agent components (themselves architectured as desired) connected to simulated situated entities living in a common 2D environment.

The important point with these abstractions is that one can actually implement its own interconnection mechanism between the dynamically created components and their creating component.
This enables for example to cleanly and easily implement any needed interaction mechanism in a MAS when there exists no agent-oriented framework proposing it, to develop domain-specific relations between the agents and their environment or more generally to easily separate concerns (the agents architecture, the simulated agent, the communication) by composing them while taking into account the 1..N relation existing between an ecosystem and its species.

SpeADL⁻

It is needed to understand the content of the SpeADL⁻ Reference Guide before reading the current document.

Ecosystem Class and Species Definition

From an external point of view, an ecosystem is exactly similar to a component: it has provided ports that can be accessed and required ports that must be connected.
It has a name, can have type parameters and be a specialisation of another component.
It has an implementation in Java, it can be used as a part of another component (or ecosystem) or instantiated directly if it has no required ports.

Its only specificity is that it can contain what is called species, a special type of component class that can only be defined in an ecosystem.
Actually, a component is just an ecosystem without any species.

Species are to ecosystems what Java non-static inner classes are to Java classes: they are components class that can only be instantiated from within an ecosystem instance.
Because of this particular relation to ecosystems, species can access elements inside the ecosystem in two different ways:
  • Directly to the parts and ports of the ecosystem.
  • Indirectly through a special construct called uses that enables to take into account the dynamic creation aspects of the species to:
    • Build tailored ecosystem-species relations.
    • Build tailored inter-species relations mediated by the ecosystem.

Uses are discussed below.

Keywords

An ecosystem class definition is declared with the keyword ecosystem followed by a name, optional type parameters and optional specialization.
Provided and required ports can be declared as with normal component classes with the keywords provides and requires.
Parts can be declared as with normal component classes with the keyword part.

A species is declared inside an ecosystem with the keyword species followed by a name starting with a capital.
It has no type parameters but follows those of its ecosystem, and cannot specialise another component.
A species can have parameters needed for its initialisation inside and  ) and separated by : they are of the form name: Type.
Provided and required ports can be declared as with normal component classes with the keywords provides and requires.
Parts can be declared as with normal component classes with the keyword part.

Details

Declaring a species means that an instance of the ecosystem containing it will be able to create new instances of the species at runtime.
Such species will be considered strongly linked to the containing ecosystem instance that created them: this is a thus 1..N relation.

The bindings of the parts can point to ports inside the species, as with a normal component, but also to ports inside the ecosystem containing the species.
They can NOT point to other species of the ecosystem (for inter-species connection, one must exploit the use abstraction detailed next).

Example

namespace simple.ecos {    
    ecosystem MyFirstEco {

        species S(name: String) {
            provides p1: AJavaInterface = c.portName
            provides p2: AJavaInterface
            requires p3: AnotherJavaInterface

            part c: MyBeautifulComponent {
                bind anotherPortName to p3
            }
        }
    }
}

Ecosystem Class and Species Implementation

Implementing an ecosystem is similar to implementing a component.
The only difference is with the species: there is methods to implement to provide for an implementation of the species and there is methods that can be used to create instances of species from within the implementation of the ecosystem.

The idea is that the only way of instantiating a species is from within an ecosystem: if one needs to do it from the exterior of the component, some ports must be defined allowing them to.

Special Method to Implement

Each species S must be implemented by overriding a method called S make_S() where S is also the name of an static inner class of the ecosystem generated abstract class.
It means that in order to implement the method make_S(), it is necessary to extends the class S in any way desired (anonymous, inner, static or not, or in its own file).
The implementation of the species can either directly subclass S in an anonymous way in the make_S() method, be defined in its own file, or, as it is always done, defined as an inner class of the ecosystem.
This last possibility can be useful to access to some Java class member of the ecosystem class for example.

Special Methods to Exploit

From the implementation of the ecosystem (for example in the implementation of one of its provided ports), each species S can be instantiated by calling the method S.Component newS() which will also have as parameters those declared in the species.

From the implementation of the species, the required and provided ports as well as the parts can be accessed through the same methods as normal component class implementations: requires(), provides() and parts().
On top of this, the required and provided ports, and the parts, of the ecosystem containing the species can be accessed respectively with eco_requires(), eco_provides() and eco_parts.

Example

package testpackage;

import my.interfaces.AJavaInterface;
import simple.ecos.MyFirstEco;
import simple.stuffs.MyBeautifulComponent;

public class MyFirstEco1 extends MyFirstEco {

    @Override
    protected S make_S(String name) {
        return new S() {

            @Override
            protected AJavaInterface make_p2() {
                return new AJavaInterface() {
                    @Override
                    public String aMethod(Integer param1) {
                        return ""+param1;
                    }
                };
            }

            @Override
            protected MyBeautifulComponent make_c() {
                return new MyComponentImpl();
            }
        };
    }
}

Of course, one can extract the implementation of the species, either as an inner class of the ecosystem implementation, or even put it in another Java file if desired.

public class MyFirstEco1 extends MyFirstEco {

    @Override
    protected S make_S(String name) {
        return new SImpl();
    }

    private final class SImpl extends S {
        @Override
        protected AJavaInterface make_p2() {
            return new AJavaInterface() {
                @Override
                public String aMethod(Integer param1) {
                    return ""+param1;
                }
            };
        }

        @Override
        protected MyBeautifulComponent make_c() {
            return new MyComponentImpl();
        }
    }
}

The Use Abstraction

As we said previously, species can only be defined inside ecosystems.
Such a relation can be exploited either:
  • At the SpeADL level with the bindings and delegation from the species to the ecosystem.
  • At a higher-level using advanced interconnection mechanisms between ecosystem and their species as explained.

Keywords

Inside a species, a special type of part can be declared using the keyword use followed by a name without capital letter.
It follows the syntax use name: partName.SpeciesName where:
  • partName is the name of a part in the ecosystem containing the current species and whose type is an ecosystem.
  • SpeciesName is the name of a species declared in the ecosystem of partName.
  • And optionally a list of arguments for the species parameters: one can refer to the parameters of the containing species only.

Details

The important point about the use abstraction is that it relies on the definition of ecosystem and species: it is a way to recursively exploit an ecosystem and its species in another ecosystem and its species.
The contained ecosystem and its parts are instantiated with the containing ecosystem, and its species instantiated with the species that use them.

Example

namespace simple.ecos {    
    ecosystem MySecondEco {

        part e: MyFirstEco

        species S(name: String) {

            part c: MySimpleComponent

            use s: e.S(name) {
                bind p3 to c.p1
            }
        }
    }
}

Mis à jour par Anonyme il y a plus de 11 ans · 34 révisions