SIFT est un outil de ligne de commande qui analyse et inverse les modèles du système logiciel des conceptions du système de JVM. Il fonctionne en traitement des fichiers .class ou .jar à l'aide de modèles prédéfinis appelés modèles de modèle système. Ces modèles fournissent des connaissances sur les piles technologiques ou les constructions spécifiques au projet, ce qui permet à l'outil de générer un modèle complet du système.
Le modèle du système résultant est composé d'entités qui décrivent la structure et le comportement du système.
--diff pour analyser l'impact des nouvelles fonctionnalités ou modifications.
Spring-Boot avec modèle de framework axon en action; Filtrage sur les commandes expédiées et confirmées dans https://github.com/eugenp/tutorials/tree/master/axon.




Usage: sift [OPTIONS]
Sift is a command-line tool that analyzes and reverse models software system designs
from JVM bytecode.
Template options:
-t, --template TEMPLATE The template producing the system model.
-l, --list-templates Print all installed templates.
-T, --list-entity-types Lists entity types defined by template.
-f, --class-dir, --classes PATH|URI|MAVEN_COORD
Provide class input as a directory, JAR file, URI
(pointing to a JAR), or Maven coordinate.
-d, --diff FILE_JSON|URI|MAVEN_COORD Compare the system model from '-f' with another,
specified as a JSON file (previously saved System
Model), class input as a directory, JAR file, URI
(pointing to a JAR), or Maven coordinate.
--profile Print execution times and input/output for the
executed template.
-D, --dump-system-model Print all entities along with their properties and
metadata.
Entity tree/graph options:
-L, --max-depth INT Max display depth of the tree.
-F, --filter REGEX Filter nodes by label. (repeatable)
-S, --filter-context REGEX Filter nodes by label, while also including
sibling nodes. (repeatable)
-e, --exclude REGEX Exclude nodes when label matches REGEX.
(repeatable)
-c, --column [all|element-id|element-type|entity-type]
Columns to display. (repeatable)
-E, --exclude-type ENTITY_TYPE Exclude entity types from tree. (repeatable)
-r, --tree-root ENTITY_TYPE Tree built around requested entity type.
(repeatable)
--no-emoji Disables printing emoji in entity labels.
Visualization options:
-R, --render Render entities with graphviz's DOT language.
--edge-layout [spline|polyline|ortho]
Sets the layout for the lines between nodes.
(default: spline)
Serialization options:
-s, --save FILE_JSON Save the resulting system model as json.
--load FILE_JSON Load a previously saved system model.
Debug options:
--debug Print log/logCount statements from the executed
template.
-X, --debug-inverse-trace Print the inverse element trace for the elements
specified with --debug-element-traces
-x, --debug-element-trace ELEMENT_ID Print all element traces leading to the specified
elements
Miscellaneous options:
-a, --ansi [none|ansi16|ansi256|truecolor]
Override automatically detected ANSI support.
--stacktrace Print stacktrace to stderr if an error occurs
--version Print version and release date.
-m, --maven-repository VALUE Additional maven repositories to use for
downloading artifacts. Maven central
(https://repo1.maven.org/maven2/) and local user
repositories are always included.
--statistics Print internal statistics about the system model
template context.
--generate-completion [bash|zsh|fish]
-h, --help Show this message and exit
Examples:
sift --template spring-axon -f my-spring-project
Model the system using the "spring-axon" template on the classes in the
"my-spring-project" directory.
sift -t spring-axon -f . -F "Order(Created|Shipped)"
Model the system using the "spring-axon" template on the current directory's
classes, filter nodes containing the regular expression "Order(Created|Shipped)".
sift -t spring-axon -f . --diff feature-01.json
Compare the current design of the system using the "spring-axon" template on
the classes in the current directory against a previously saved system model
from "feature-01.json" and show the differences.
sift -t sift -f "net.onedaybeard.sift:core:0.13.0" --diff "net.onedaybeard.sift:core:0.9.0"
Compare two different versions of the DSL API using the 'sift' template, specified
by their maven coordinates.
Le modèle du système décrit la structure et les relations des entités au sein d'un système. Une entité est un objet ou un composant dans le système, identifié de manière unique par une classe, une méthode, un champ, un paramètre ou une signature générique.
Les entités sont classées par leur Entity.Type . Un type d'entité représente toute partie remarquable du système. Par exemple, les types peuvent inclure des contrôleurs de repos, des points de terminaison HTTP, des messages entrants / sortants, des RD, des référentiels et plus encore.
$ sift --template spring-axon -f target/classes --list-entity-types
entity types of spring-axon
1 aggregate
2 aggregate-ctor
1 aggregate-member
6 command
6 command-handler
1 controller
13 endpoint
7 event
7 event-handler
7 event-sourcing-handler
1 projection
3 query
4 query-handlerLes modèles de modèle système décrivent comment les entités sont identifiées dans une pile de technologie donnée et / ou des constructions spécifiques au projet. Les modèles sont écrits dans un DSL déclaratif et sont utilisés pour produire le modèle système à partir des classes d'entrée. Le DSL fournit des abstractions de haut niveau pour identifier et interrelier les entités de la structure ou de l'utilisation des classes.
Le code ci-dessous montre un modèle de modèle système simple qui identifie les contrôleurs REST et les points de terminaison HTTP dans un système et associe les deux entités.
val controller = Entity . Type ( " controller " )
val endpoint = Entity . Type ( " endpoint " )
template {
// iterate over all input classes
classes {
annotatedBy< RestController >() // filter classes
entity(controller) // mark remaining as 'controller'
methods { // iterate all controller methods
annotatedBy< Endpoint >() // filter @Endpoint methods
entity(endpoint)
// associate controllers with their endpoints
controller[ " endpoints " ] = endpoint
}
}
} Les éléments d'entrée (classes, méthodes, paramètres, champs, signatures génériques) sont traitées par lots, ligne par ligne. L'exécution d'un modèle de modèle système peut être introspectée avec l'option --profile .

Un modèle typique peut être exprimé dans environ 100-200 lignes de code. Certains modèles, tels que ceux de JPA et JDBI, sont notablement plus courts. Les modèles définis par l'utilisateur peuvent inclure plusieurs modèles existants pour mieux décrire le système sous-jacent tout en gardant le DSL concis résultant.
SIFT nécessite une course Java 17 ou ultérieure.
Pour les utilisateurs de fenêtres, il est recommandé d'exécuter SIFT sous WSL, jusqu'à ce que les chemins Windows appropriés soient en place.
La façon la plus simple d'installer Sift est de cloner le référentiel et d'exécuter mvn install , puis de copier sift.zsh | sh à un emplacement sur le $PATH , par exemple:
mvn install à partir de Root du projet. Cela installe sift sur ~/.local/share/sift/binsift.zsh ou sift.sh sur ~/.local/bin/sift La succursale main pointe toujours vers le dernier engagement de version.
Si GRAALVM et IMAGE natif sont installés, un binaire natif peut être construit avec le profil Maven native-image : mvn install -P native-image . Le binaire résultant sera situé dans ~/.local/share/sift/bin/sift . sift.zsh et sift.sh vérifie d'abord si le binaire natif est disponible, sinon il essaie d'exécuter le pot.
Le binaire natif est considérablement plus rapide que le pot, mais il peut entraîner des problèmes s'il doit désérialiser un modèle système (via --load ou --diff ) ou un modèle de modèle système contenant des types inconnus (par exemple de withValue() ).