Documentation · Modèles Java

Le même graphe, déclaré en Java.

Modèle dynamique et modèle annoté ne sont pas deux moteurs. Ils construisent les mêmes sortes de Generic dans le même graphe. Le choix porte sur la déclaration, pas sur l'exécution.

Deux façons

Dynamique ou annoté.

Le modèle dynamique est pratique quand la structure doit être créée ou modifiée à l'exécution. Le modèle annoté est pratique quand une partie stable du domaine mérite une identité Java explicite, versionnée avec le code et retrouvable par engine.find(...).

Ce qui ne change pas

Les données restent des Generics.

Dans les deux cas, les instances métier, holders et links se créent avec la même API du graphe. Seule la façon de fournir la signature au moteur change.

Quatre familles d'annotations

Le minimum pour lire un modèle Java.

1

@SystemGeneric

La classe correspond à un Generic monté au démarrage dans le SystemCache.

2

@Supers

Déclare la spécialisation dans le graphe — pas une hiérarchie Java extends.

3

@Components

Fixe les composants ordonnés : la signature structurelle d'un attribut ou d'une relation.

4

Contraintes

@PropertyConstraint, @SingularConstraint, @InstanceValueClassConstraint… les mêmes règles que l'API dynamique.

Un domaine compact

Le même Vehicle du didacticiel.

Un petit domaine versionné, prêt à être fourni à l'Engine ou à une configuration de déploiement.

public final class VehicleDomain {

    @SystemGeneric
    public interface Vehicle {}

    @SystemGeneric
    @Supers(Vehicle.class)
    public interface Car {}

    @SystemGeneric
    public interface Color {}

    @SystemGeneric
    @Components(Vehicle.class)
    @PropertyConstraint
    @InstanceValueClassConstraint(Integer.class)
    public interface Power {}

    @SystemGeneric
    @Components({ Vehicle.class, Color.class })
    public interface VehicleColor {}

    public static final Class[] ALL_TYPES = {
        Vehicle.class, Car.class, Color.class, Power.class, VehicleColor.class
    };
}

On démarre l'Engine avec le modèle, puis on retrouve les nœuds par leur classe :

Engine engine = new Engine(VehicleDomain.ALL_TYPES);

Generic car = engine.find(VehicleDomain.Car.class);
Generic power = engine.find(VehicleDomain.Power.class);

Generic car42 = car.setInstance("car-42");
car42.setHolder(power, 180);
engine.getCurrentCache().flush();

Un détail qui surprend

La value par défaut est la classe Java.

Pour un nœud annoté, le SystemCache utilise par défaut la classe comme value : vehicle.getValue() vaut Vehicle.class. C'est volontaire : la classe fournit une identité stable. Il ne faut donc pas supposer que le nœud sera retrouvé par la chaîne "Vehicle".

C'est pourquoi engine.find(MyType.class) est la référence canonique d'un nœud système déclaré au démarrage — et non une recherche par nom. Des annotations de valeur existent pour donner explicitement une autre valeur, mais pour un modèle Java ordinaire, on conserve la valeur par défaut.

Comparer les deux styles

Le runtime est identique.

IntentionModèle dynamiqueModèle annoté
Typeengine.setInstance("Vehicle")@SystemGeneric Vehicle
Sous-typesuper lors de la construction@Supers(Vehicle.class)
Attributvehicle.setAttribute("Power")@Components(Vehicle.class)
Relationvehicle.setRelation("VehicleColor", color)@Components({Vehicle.class, Color.class})
Propriétépower.enablePropertyConstraint()@PropertyConstraint
Référencevariable Genericengine.find(Power.class)
Instances, holders, links, transactionidentiques

Un Engine peut aussi démarrer avec un socle annoté puis recevoir des structures dynamiques : les deux chemins produisent des Generic soumis aux mêmes règles.

La documentation continue ailleurs

La structure, c'est aussi une interface.

Une fois le modèle posé, GS-Reactor en projette l'application web et GS-Agent l'expose à un agent IA. C'est le même graphe vivant, observé par deux surfaces.