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

Has

Projects role-level susceptibility knowledge onto a concrete resource by cloning a frozen causal graph, then safely removes orphaned projections.

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 FREEZE or REFERENCE potentialities that the role — or its Near twin — Is_Susceptible_To.

MATERIALIZEClone causal tree

Recursively follows Generated_By in both directions with a visited set and creates frozen, traceable clones.

AFTER DELETEClean safely

Subtracts trees protected by another role, deletes resource-specific nodes, then removes orphan shared clones to a fixpoint.

01 · Materialization

Role knowledge becomes resource-specific state

Reference knowledge
RolePotentiality
PotentialityGenerated_By tree
Runtime projection
ResourceFREEZE clone
CloneNear original

A shared top clone 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 Generated_By 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
remove Resource --Is_Susceptible_To--> projectedRoot
delete resource-specific clones
repeat until no deletion:
    for sharedClone in remaining candidates:
        if no susceptibility points to sharedClone
           and no external Generated_By references its tree:
            delete sharedClone
Idempotence and recursion

Existence queries prevent duplicate edges. All derived writes use preAndPostTreatment=false, which stops Has and Generated_By 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

Projette la susceptibilité d’un rôle vers une ressource concrète en clonant un graphe causal figé, puis supprime sans risque les projections 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 potentialités FREEZE ou REFERENCE auxquelles le rôle — ou son jumeau Near — est Is_Susceptible_To.

MATÉRIALISERCloner l’arbre causal

Suit Generated_By dans les deux sens avec un ensemble visited et produit des clones figés et traçables.

APRÈS SUPPRESSIONNettoyer sûrement

Soustrait les arbres protégés par un autre rôle, supprime les nœuds privés, puis 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
RolePotentiality
Potentialityarbre Generated_By
Projection runtime
Resourceclone FREEZE
CloneNear original

Un clone racine partagé 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 Generated_By :
        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
supprimer Resource --Is_Susceptible_To--> racineProjetée
supprimer les clones propres à la ressource
répéter jusqu’à stabilité :
    pour chaque clone partagé encore candidat :
        si aucune susceptibilité ne pointe vers le clone partagé
           et aucune référence Generated_By 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 Generated_By 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 →