O SIFT é uma ferramenta de linha de comando que analisa e modelos reversos designs do sistema de software da JVM Bytecode. Ele opera processando arquivos .class ou .jar usando modelos predefinidos conhecidos como modelos de modelo do sistema. Esses modelos fornecem conhecimento sobre pilhas de tecnologia ou construções específicas do projeto, o que permite que a ferramenta gere um modelo abrangente do sistema.
O modelo de sistema resultante é composto de entidades que descrevem a estrutura e o comportamento do sistema.
--diff para analisar o impacto de novos recursos ou alterações.
Spring-boot com modelo de estrutura axon em ação; Filtrando em pedidos enviados e confirmados em 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.
O modelo do sistema descreve a estrutura e as relações de entidades dentro de um sistema. Uma entidade é um objeto ou componente dentro do sistema, identificado exclusivamente por uma classe, método, campo, parâmetro ou assinatura genérica.
As entidades são categorizadas por sua Entity.Type . Um tipo de entidade representa qualquer parte notável do sistema. Por exemplo, os tipos podem incluir controladores REST, terminais HTTP, mensagens de entrada/saída, RDS, repositórios e muito mais.
$ 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-handlerOs modelos do modelo do sistema descrevem como as entidades são identificadas em uma determinada pilha de tecnologia e/ou construções específicas do projeto. Os modelos são escritos em um DSL declarativo e são usados para produzir o modelo do sistema a partir de classes de entrada. O DSL fornece abstrações de alto nível para identificar e inter-relacionar entidades da estrutura ou uso de classes.
O código abaixo mostra um modelo simples de modelo do sistema que identifica os controladores REST e os terminais HTTP em um sistema e associa as duas 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
}
}
} Elementos de entrada (classes, métodos, parâmetros, campos, assinaturas genéricas) são processadas em lotes, linha por linha. A execução de um modelo de modelo do sistema pode ser introspectada com a opção --profile .

Um modelo típico pode ser expresso em cerca de 100-200 linhas de código. Alguns modelos, como os JPA e JDBI, são notavelmente mais curtos. Os modelos definidos pelo usuário podem incluir vários modelos existentes para descrever melhor o sistema subjacente, além de manter a DSL resultante concisa.
O SIFT requer um Java 17 ou posterior tempo de execução.
Para usuários de janelas, é recomendável executar o SIFT sob WSL, até que os caminhos adequados do Windows estejam no lugar.
A maneira mais fácil de instalar o SIFT é clonar o repositório e executar mvn install e copiar SIFT.zsh | sh para um local no $PATH , por exemplo:
mvn install no Project Root. Isso instala peneirar para ~/.local/share/sift/binsift.zsh ou sift.sh para ~/.local/bin/sift A filial main sempre aponta para a última confirmação de lançamento.
Se o Graalvm e a imagem nativa forem instalados, um binário nativo poderá ser construído com o perfil do maven de native-image : mvn install -P native-image . O binário resultante estará localizado em ~/.local/share/sift/bin/sift . sift.zsh e sift.sh Primeiro verifica se o binário nativo está disponível, caso contrário, ele tenta executar o frasco.
O binário nativo é consideravelmente mais rápido que o frasco, mas pode causar problemas se precisar desserializando um modelo de sistema (via --load ou --diff ) ou modelo de modelo do sistema contendo tipos desconhecidos (por exemplo, com withValue() ).