r-io suiter-io suiteinterceptor docs
← Model loading
Edge interceptor / Resource projection

Has

Passes the susceptibility of a role on to each resource that has it, with the rule of the role copied, then safely removes it and the projections that became orphans.

HAS

HasModelsPopulateInterceptor

The most structural interceptor in the chain.

Resource → Has → Role
TriggerThe edge is exactly Has and its target inherits Role; the source is taken as-is (typically a Resource) without type check.
AFTER ADD/UPDATEFind susceptibility

Queries the potentials that the role — or its Near twin — Is_Susceptible_To, and links the resource to each potential itself (no clone) by its own Is_Susceptible_To, with the rule of the role copied.

MATERIALIZEClone causal tree

Only for a potential that induces nothing: a susceptibility only generates the risks its potential Induces (generated by the Induces interceptor). Otherwise, reads the potentialities named by the susceptibility condition, recursively follows Generates and Creates in both directions with a visited set and creates frozen, traceable clones.

AFTER DELETEClean safely

Removes the Is_Susceptible_To of the resource unless another role keeps it, deletes resource-specific nodes, then, once the last holder is gone, removes orphan shared clones to a fixpoint.

01 · Materialization

Role knowledge becomes resource-specific state

Reference knowledge
Role→Potential (rule)
Named potentiality↔Generates / Creates tree
⇒
Runtime projection
Resource→Potential (rule copied)
Named potentiality→FREEZE clone
Clone→Near original

The potential itself is never cloned: its edge to the resource carries the id <potential>__<resource>_susceptible, the very edge the Induces interceptor writes the law of the danger zone on. After a Has is added, the induced risk chains are generated again, so the new holder of a role gets its own risks. The copy follows the rule of the role, generated by the Induces interceptor or written by hand, until the rule of that resource is changed by hand. A shared clone of a named potentiality is reused when possible. If a generator directly Impacts the role, the interceptor creates a resource-specific frozen clone and reproduces the impact toward the resource. Every clone receives a UUID, a new color, FREEZE status and cleared modeling/broken-edge state.

recursive constructioncycle protected
materialize(original, resource, visited):
    if original.id in visited: return existing clone
    visited.add(original.id)
    clone = select shared or resource-specific strategy
    clone.status = FREEZE
    add Near(clone, original)
    for relation, neighbor in Generates / Creates neighbors(original):
        child = materialize(neighbor, resource, visited)
        recreate relation between clone and child
    return clone
02 · Deletion

Protection first, then bottom-up cleanup

Capture endpointsbefore Has disappears
Find protected treesreachable by other roles
Subtractdoomed − protected
Delete private clonesresource-specific
Fixpoint cleanuporphan shared nodes
afterDeleteorphan rule
if no other role of the resource is susceptible to the potential:
    remove Resource --Is_Susceptible_To--> potential
delete resource-specific clones
if no resource holds a role susceptible to the potential:
  repeat until no deletion:
    for sharedClone in remaining candidates:
        if no susceptibility points to sharedClone
           and no external causal link references its tree:
            delete sharedClone
Idempotence and recursion

Existence queries prevent duplicate edges. All derived writes use preAndPostTreatment=false, which stops Has and the causal links from repeatedly intercepting the structure they create.

Implementation watchpoint

buildFreezeCloneFrom assigns clone = original before mutating id, status and modeling fields. The original Java object must not be reused after this call, because the method does not make a defensive copy.

Compare with the other edge behaviorsAll edge interceptors →
Intercepteur d’arête / Projection des ressources

Has

Transmet la susceptibilité d’un rôle à chaque ressource qui l’a, avec la règle du rôle recopiée, puis la retire sans risque avec les projections devenues orphelines.

HAS

HasModelsPopulateInterceptor

L’intercepteur le plus structurel de la chaîne.

Resource → Has → Role
DéclencheurL’arête est exactement Has et sa cible hérite de Role ; la source est prise telle quelle (généralement une Resource) sans contrôle de type.
APRÈS AJOUT/UPDATETrouver la susceptibilité

Interroge les potentiels auxquels le rôle — ou son jumeau Near — est Is_Susceptible_To, et relie la ressource à chaque potentiel lui-même (sans clone) par son propre Is_Susceptible_To, avec la règle du rôle recopiée.

MATÉRIALISERCloner l’arbre causal

Seulement pour un potentiel qui n’induit rien : une susceptibilité ne génère que les risques que son potentiel Induces (générés par l’intercepteur Induces). Sinon, lit les potentialités nommées par la condition de susceptibilité, suit Generates et Creates dans les deux sens avec un ensemble visited et produit des clones figés et traçables.

APRÈS SUPPRESSIONNettoyer sûrement

Retire l’Is_Susceptible_To de la ressource sauf si un autre rôle le garde, supprime les nœuds privés, puis, une fois le dernier porteur parti, les clones partagés orphelins jusqu’au point fixe.

01 · Matérialisation

La connaissance du rôle devient un état propre à la ressource

Connaissance de référence
Role→Potential (règle)
Potentialité nommée↔arbre Generates / Creates
⇒
Projection runtime
Resource→Potential (règle recopiée)
Potentialité nommée→clone FREEZE
Clone→Near original

Le potentiel lui-même n’est jamais cloné : son arête vers la ressource porte l’id <potentiel>__<ressource>_susceptible, celle-là même où l’intercepteur Induces écrit la loi de la zone de danger. Après l’ajout d’un Has, les chaînes des risques induits sont régénérées : le nouveau porteur d’un rôle reçoit ses propres risques. La copie suit la règle du rôle, générée par l’intercepteur Induces ou écrite à la main, jusqu’à ce que la règle de cette ressource soit retouchée à la main. Un clone partagé d’une potentialité nommée est réutilisé si possible. Si un générateur Impacts directement le rôle, un clone figé propre à la ressource est créé et l’impact est reproduit vers cette ressource. Chaque clone reçoit un UUID, une nouvelle couleur, le statut FREEZE et perd ses données de modélisation et broken edges.

construction récursiveprotégée contre les cycles
matérialiser(original, ressource, visited) :
    si original.id dans visited : retourner le clone existant
    visited.ajouter(original.id)
    clone = choisir partagé ou propre à la ressource
    clone.status = FREEZE
    ajouter Near(clone, original)
    pour relation, voisin dans voisins Generates / Creates :
        enfant = matérialiser(voisin, ressource, visited)
        recréer la relation entre clone et enfant
    retourner clone
02 · Suppression

Protéger d’abord, nettoyer de bas en haut

Capturerextrémités avant disparition
Protégerarbres d’autres rôles
Soustrairecondamnés − protégés
Supprimerclones propres
Point fixeorphelins partagés
afterDeleterègle d’orphelin
si aucun autre rôle de la ressource n’est susceptible au potentiel :
    supprimer Resource --Is_Susceptible_To--> potentiel
supprimer les clones propres à la ressource
si plus aucune ressource n’a de rôle susceptible au potentiel :
  répéter jusqu’à stabilité :
    pour chaque clone partagé encore candidat :
        si aucune susceptibilité ne pointe vers le clone partagé
           et aucun lien causal externe ne vise son arbre :
            supprimer le clone
Idempotence et récursion

Les requêtes d’existence évitent les doublons. Toutes les écritures dérivées utilisent preAndPostTreatment=false, ce qui empêche Has et les liens causaux de retraiter la structure qu’ils créent.

Point de vigilance

buildFreezeCloneFrom fait clone = original avant de modifier l’identifiant, le statut et la modélisation. L’objet Java original ne doit donc pas être réutilisé après l’appel.

Comparer les autres comportements d’arêtesTous les intercepteurs d’arêtes →