Este projeto tem como objetivo principal a geração de um sistema Java completo (Spring Boot + MVC em camadas) a partir de uma DSL desenvolvida com Langium. A DSL utiliza uma sintaxe inspirada em diagramas de classes UML para descrever a estrutura do sistema desejado. Esta documentação está dividida em duas partes: a primeira foca na definição da gramática Langium (parte TypeScript), e a segunda apresenta o sistema gerado em Java.
A linguagem "Ovelha" (".ov") é uma DSL criada com Langium para descrever modelos de dados e lógica de aplicação. A entrada é transformada por um parser e um gerador em um projeto Spring Boot.
grammar Ovelha
entry Model:
(classes+=Classe)+;
Classe:
'class' name=ID '{'
features+= Feature*
'}';
Feature:
Attribute | Method;
Attribute:
type = Type name=ID;
Method:
type = Type name=ID '(' (parameters= ParemeterList)? ')';
ParemeterList:
parameters+=Parameter (',' parameters+=Parameter)*;
Parameter:
type = Type name=ID;
Type returns string:
('int' | 'String' | 'boolean' | 'float' | 'double' | 'char' | 'byte' | 'short' | 'long');
hidden terminal WS: /\s+/;
terminal ID: /[_a-zA-Z][\w_]*/;
terminal INT returns number: /[0-9]+/;
terminal STRING: /"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/;
terminal BOOLEAN: /true|false/;
terminal FLOAT: /-?\d+\.\d+/;
terminal DOUBLE: /-?\d+\.\d+([eE][-+]?\d+)?/;
hidden terminal ML_COMMENT: /\/\*[\s\S]*?\*\//;
hidden terminal SL_COMMENT: /\/\/[^\n\r]*/;class Pessoa {
int idade
String nome
int somaIdade(int idade)
}
class Pet {
String especie
int idade
}
-
O Langium interpreta o arquivo
.ove constrói um modelo em AST. -
O gerador percorre a AST e cria arquivos
.javapara cada classe e enum descrito.
-
Para cada
classe:-
Gera:
domain/NomeDaClasse.java -
Gera:
repository/NomeDaClasseRepository.java -
Gera:
service/NomeDaClasseService.java -
Gera:
controller/NomeDaClasseController.java
-
-
Para cada possivel [Futuro]
enum:- Gera:
domain/NomeDoEnum.java
- Gera:
A DSL Langium define a estrutura do sistema em .ov. O gerador converte isso em um projeto Spring Boot com MVC.
src/main/java/com/projetoSpring/
├── domain/ # Entidades (@Entity)
├── repository/ # Repositórios (JpaRepository)
├── service/ # Lógica de negócio (@Service)
└── controller/ # Controladores REST (@RestController)
@Entity
public class Pessoa {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nome;
private int idade;
// Getters e Setters
}public interface PessoaRepository extends JpaRepository<Pessoa, Long> {
}@Service
public class PessoaService {
private final PessoaRepository pessoaRepository;
public PessoaService(PessoaRepository pessoaRepository) {
this.pessoaRepository = pessoaRepository;
}
public List<Pessoa> listarTodas() {
return pessoaRepository.findAll();
}
}@RestController
@RequestMapping("/pessoas")
public class PessoaController {
private final PessoaService pessoaService;
public PessoaController(PessoaService pessoaService) {
this.pessoaService = pessoaService;
}
@GetMapping
public List<Pessoa> listarTodas() {
return pessoaService.listarTodas();
}
}-
Unitários: PessoaServiceTest com Mockito
-
Integração: PessoaControllerTest com MockMvc
-
Spring Boot
-
Spring Data JPA
-
PostgreSQL
-
JUnit 5 + Mockito
-
Langium (TypeScript)
-
Suporte a associações e cardinalidades entre classes.
-
Compatibilidade com plantUML para gerar diagramas visuais.
-
Suporte a visibilidade (
+,-,#). -
Geração de DTOs e validações com annotations.
Com essa estrutura, você consegue modelar sua aplicação de forma simples e gerar uma estrutura robusta automaticamente. A divisão clara entre a DSL e o código Java gerado permite manutenção, testes e expansão facilitadas.