@SystemGeneric
La classe correspond à un Generic monté au démarrage dans le SystemCache.
Documentation · Modèles 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
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
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
@SystemGenericLa classe correspond à un Generic monté au démarrage dans le SystemCache.
@SupersDéclare la spécialisation dans le graphe — pas une hiérarchie Java extends.
@ComponentsFixe les composants ordonnés : la signature structurelle d'un attribut ou d'une relation.
@PropertyConstraint, @SingularConstraint, @InstanceValueClassConstraint… les mêmes règles que l'API dynamique.
Un domaine compact
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
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
| Intention | Modèle dynamique | Modèle annoté |
|---|---|---|
| Type | engine.setInstance("Vehicle") | @SystemGeneric Vehicle |
| Sous-type | super lors de la construction | @Supers(Vehicle.class) |
| Attribut | vehicle.setAttribute("Power") | @Components(Vehicle.class) |
| Relation | vehicle.setRelation("VehicleColor", color) | @Components({Vehicle.class, Color.class}) |
| Propriété | power.enablePropertyConstraint() | @PropertyConstraint |
| Référence | variable Generic | engine.find(Power.class) |
| Instances, holders, links, transaction | identiques | |
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
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.