SIFT es una herramienta de línea de comandos que analiza y revertirá los diseños de sistemas de software de modelos desde el código de bytecode JVM. Funciona procesando archivos .class o .jar utilizando plantillas predefinidas conocidas como plantillas de modelo de sistema. Estas plantillas proporcionan conocimiento sobre pilas de tecnología o construcciones específicas del proyecto, lo que permite a la herramienta generar un modelo integral del sistema.
El modelo del sistema resultante está compuesto por entidades que describen la estructura y el comportamiento del sistema.
--diff para analizar el impacto de nuevas características o cambios.
Spring-Boot con plantilla de marco de Axon en acción; Filtrado en pedidos enviados y confirmados en 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.
El modelo del sistema describe la estructura y las relaciones de las entidades dentro de un sistema. Una entidad es un objeto o componente dentro del sistema, identificado de forma única por una clase, método, campo, parámetro o firma genérica.
Las entidades son categorizadas por su Entity.Type . Un tipo de entidad representa cualquier parte notable del sistema. Por ejemplo, los tipos pueden incluir controladores de descanso, puntos finales HTTP, mensajes entrantes/salientes, RDS, repositorios y más.
$ 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-handlerLas plantillas del modelo del sistema describen cómo se identifican las entidades dentro de una pila de tecnología dada y/o construcciones específicas del proyecto. Las plantillas se escriben en un DSL declarativo y se utilizan para producir el modelo del sistema a partir de clases de entrada. El DSL proporciona abstracciones de alto nivel para identificar e interrelacionar a las entidades de la estructura o uso de la clase.
El siguiente código muestra una plantilla de modelo de sistema simple que identifica controladores de descanso y puntos finales HTTP dentro de un sistema y asocia las dos entidades.
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
}
}
} Los elementos de entrada (clases, métodos, parámetros, campos, firmas genéricas) se procesan en lotes, línea por línea. La ejecución de una plantilla de modelo de sistema puede introspectarse con la opción --profile .

Una plantilla típica se puede expresar en aproximadamente 100-200 líneas de código. Algunas plantillas, como las de JPA y JDBI, son notablemente más cortas. Las plantillas definidas por el usuario pueden incluir múltiples plantillas existentes para describir mejor el sistema subyacente y al mismo tiempo mantener el DSL conciso resultante.
SIFT requiere un tiempo de ejecución Java 17 o posterior.
Para los usuarios de ventanas, se recomienda ejecutar SIFT bajo WSL, hasta que estén en su lugar las rutas de Windows adecuadas.
La forma más fácil de instalar SIFT es clonar el repositorio y ejecutar mvn install , y luego copiar sift.zsh | sh a una ubicación en la $PATH , por ejemplo:
mvn install desde la raíz del proyecto. Esto instala Sift a ~/.local/share/sift/binsift.zsh o sift.sh a ~/.local/bin/sift La rama main siempre apunta a la última confirmación de lanzamiento.
Si se instala GRAALVM y Native-Image, se puede construir un binario nativo con el perfil maven native-image : mvn install -P native-image . El binario resultante se ubicará en ~/.local/share/sift/bin/sift . sift.zsh y sift.sh Primera verificación si el binario nativo está disponible, de lo contrario intenta ejecutar el frasco.
El binario nativo es considerablemente más rápido que el frasco, pero puede causar problemas si necesita deserializar un modelo de sistema (a través de --load o --diff ) o plantilla de modelo de sistema que contiene tipos desconocidos (por ejemplo, de withValue() ).