====== 5. Modelado de la aplicación ======
Usar UML para modelar la aplicación.
La mejor herramienta es [[https://plantuml.com/es/|PlantUML]]
* [[https://plantuml.com/es/download|Plant UML Download]]: El jar que transforma el texto de UML en un PNG con el diagrama
* [[https://plantuml.com/es/command-line|Command line]]: Generar el diagrama dese la linea de comandos usando el jar anterior
* [[https://plugins.jetbrains.com/plugin/7017-plantuml4idea|plantuml4idea]]: Plugin en IntelliJ
===== Modelo de datos =====
title Pedido, LineaPedido y Cliente
class Cliente {
id
nombre
mail
}
class Pedido {
id
fecha
total
-- Reglas --
fecha>=Hoy
total>0
}
class LineaPedido {
cantidad : BigDecimal
precioUnitario : BigDecimal
subtotal : BigDecimal
-- Reglas --
subtotal=cantidad * precioUnitario
cantidad>0
precioUnitario>0
}
Cliente "1" -- "0..*" Pedido
Pedido "1" -- "1..*" LineaPedido
@startuml
title Pedido, LineaPedido y Cliente
class Cliente {
id
nombre
mail
}
class Pedido {
id
fecha
total
-- Reglas --
fecha>=Hoy
total>0
}
class LineaPedido {
cantidad : BigDecimal
precioUnitario : BigDecimal
subtotal : BigDecimal
-- Reglas --
subtotal=cantidad * precioUnitario
cantidad>0
precioUnitario>0
}
Cliente "1" -- "0..*" Pedido
Pedido "1" -- "1..*" LineaPedido
@enduml
EntornoCriptografico ..> EntornoCriptograficoConfig
DispositivoCriptografico ..> DispositivoCriptograficoConfig
AlmacenCertificadosConfiables ..> AlmacenCertificadosConfiablesConfig
EntornoCriptografico *-left- AlmacenCertificadosConfiables
EntornoCriptografico *-right- "*" DispositivoCriptografico
EntornoCriptograficoConfig *-left- AlmacenCertificadosConfiablesConfig
EntornoCriptograficoConfig *-right- "*" DispositivoCriptograficoConfig
class AlmacenCertificadosConfiables {
trustedKeyStore
}
class DispositivoCriptografico {
PrivateKey getPrivateKey(Alias)
Certificate[] getCertificateChain(Alias)
List getAliases()
}
class DispositivoCriptograficoConfig {
pkcs11LibraryPath
slot
pin
}
class AlmacenCertificadosConfiablesConfig {
InputStream
password
}
EntornoCriptografico ..> EntornoCriptograficoConfig
DispositivoCriptografico ..> DispositivoCriptograficoConfig
AlmacenCertificadosConfiables ..> AlmacenCertificadosConfiablesConfig
EntornoCriptografico *-left- AlmacenCertificadosConfiables
EntornoCriptografico *-right- "*" DispositivoCriptografico
EntornoCriptograficoConfig *-left- AlmacenCertificadosConfiablesConfig
EntornoCriptograficoConfig *-right- "*" DispositivoCriptograficoConfig
class AlmacenCertificadosConfiables {
trustedKeyStore
}
class DispositivoCriptografico {
PrivateKey getPrivateKey(Alias)
Certificate[] getCertificateChain(Alias)
List getAliases()
}
class DispositivoCriptograficoConfig {
pkcs11LibraryPath
slot
pin
}
class AlmacenCertificadosConfiablesConfig {
InputStream
password
}
DocumentoPdfFactory --> "*" DocumentoPdf
AlmacenClave <- DocumentoPdf
DocumentoPdf -> CampoFirma
DocumentoPdf -> ResultadoFirma
AlmacenClave <|-- AlmacenClaveFichero
AlmacenClave <|-- AlmacenClaveDispositivo
ResultadoFirma *-- DatosCertificado
DocumentoPdfFactory --> "*" DocumentoPdf
AlmacenClave <- DocumentoPdf
DocumentoPdf -> CampoFirma
DocumentoPdf -> ResultadoFirma
AlmacenClave <|-- AlmacenClaveFichero
AlmacenClave <|-- AlmacenClaveDispositivo
ResultadoFirma *-- DatosCertificado
===== Modelo de estados =====
[*] --> ENTRADA_DATOS
ENTRADA_DATOS -> [*] : DELETE
ENTRADA_DATOS --> PENDIENTE_PRESENTACION : GUARDAR_DATOS
PENDIENTE_PRESENTACION --> ENTRADA_DATOS : BACK
PENDIENTE_PRESENTACION --> PENDIENTE_RESOLUCION : PRESENTAR
PENDIENTE_RESOLUCION --> ENTRADA_DATOS : RESOLVER[tipoResolucion=SUBSANAR_DATOS]
PENDIENTE_RESOLUCION --> ACEPTADO : RESOLVER[tipoResolucion=ACEPTAR]
PENDIENTE_RESOLUCION --> RECHAZADO : RESOLVER[tipoResolucion=RECHAZAR]
[*] --> ENTRADA_DATOS
ENTRADA_DATOS -> [*] : DELETE
ENTRADA_DATOS --> PENDIENTE_PRESENTACION : GUARDAR_DATOS
PENDIENTE_PRESENTACION --> ENTRADA_DATOS : BACK
PENDIENTE_PRESENTACION --> PENDIENTE_RESOLUCION : PRESENTAR
PENDIENTE_RESOLUCION --> ENTRADA_DATOS : RESOLVER[tipoResolucion=SUBSANAR_DATOS]
PENDIENTE_RESOLUCION --> ACEPTADO : RESOLVER[tipoResolucion=ACEPTAR]
PENDIENTE_RESOLUCION --> RECHAZADO : RESOLVER[tipoResolucion=RECHAZAR]
* Ejemplo de navegación entre páginas:
[*] --> Login
Login --> Home : botón "Entrar"\n(credenciales correctas)
Login --> Login : botón "Entrar"\n(credenciales incorrectas)
Home --> Perfil : link "Perfil"
Home --> Login : link "Salir"
Perfil --> Home : link "Home"
[*] --> Login
Login --> Home : botón "Entrar"\n(credenciales correctas)
Login --> Login : botón "Entrar"\n(credenciales incorrectas)
Home --> Perfil : link "Perfil"
Home --> Login : link "Salir"
Perfil --> Home : link "Home"