Este documento explica los cambios realizados en la reestructuración del proyecto HealingTouch hacia una arquitectura JavaFX moderna y profesional.
src/
└── com/healingtouch/
├── main/
│ └── Main.java
├── controller/
│ ├── LoginController.java (con lógica de BD y negocio)
│ ├── DoctorController.java
│ ├── PatientController.java
│ └── ManagerController.java
├── view/
│ ├── Login.fxml
│ ├── Doctor.fxml
│ ├── Patient.fxml
│ └── Manager.fxml
├── model/
│ ├── User.java
│ └── Patient.java
├── helpers/
│ ├── JDBCConnectionPool.java
│ └── ObjectPool.java
└── resources/
├── css/
└── images/
src/
├── main/
│ ├── java/com/healingtouch/
│ │ ├── app/
│ │ │ └── HealingTouchApp.java (nuevo nombre)
│ │ ├── config/
│ │ │ └── DatabaseConfig.java (nuevo - Singleton)
│ │ ├── controller/
│ │ │ ├── LoginController.java (refactorizado - sin lógica BD)
│ │ │ ├── DoctorController.java
│ │ │ ├── PatientController.java
│ │ │ └── ManagerController.java
│ │ ├── model/
│ │ │ ├── User.java
│ │ │ └── Patient.java
│ │ ├── repository/
│ │ │ ├── UserRepository.java (nuevo)
│ │ │ └── PatientRepository.java (nuevo)
│ │ ├── service/
│ │ │ ├── AuthenticationService.java (nuevo)
│ │ │ └── PatientService.java (nuevo)
│ │ └── util/
│ │ ├── JDBCConnectionPool.java
│ │ └── ObjectPool.java
│ └── resources/com/healingtouch/
│ ├── view/
│ │ ├── Login.fxml
│ │ ├── Doctor.fxml
│ │ ├── Patient.fxml
│ │ └── Manager.fxml
│ ├── css/
│ │ └── application.css
│ └── images/
│ └── *.png
└── test/
├── java/
└── resources/
Antes:
- Java 8 (con JavaFX incluido)
- JavaFX Maven Plugin versión 8.8.3
Después:
- Java 17
- JavaFX 17 como dependencia separada
- OpenJFX Maven Plugin versión 0.0.8
Antes: com.healingtouch.main.Main
package com.healingtouch.main;
public class Main extends Application {
public static Stage stage = null;
// ...
}Después: com.healingtouch.app.HealingTouchApp
package com.healingtouch.app;
public class HealingTouchApp extends Application {
public static Stage stage = null;
// ... mejor documentado
}Archivo: DatabaseConfig.java
- Patrón Singleton para gestión centralizada de BD
- Pool de conexiones compartido
- Fácil modificación de parámetros de conexión
DatabaseConfig config = DatabaseConfig.getInstance();
Connection conn = config.getConnection();
// usar conexión
config.releaseConnection(conn);Los repositorios encapsulan todas las operaciones de base de datos.
UserRepository.java:
findByEmailAndPassword(email, password)- LoginexistsByEmail(email)- Verificar si email existesave(user)- Guardar usuario
PatientRepository.java:
existsByDocumentId(documentId)- Verificar si paciente existesave(...)- Guardar paciente
Los servicios contienen la lógica de negocio y validan reglas.
AuthenticationService.java:
authenticate(email, password)- Autenticar usuarioemailExists(email)- Validar email
PatientService.java:
registerPatient(...)- Registrar paciente completo- Retorna códigos: "SUCCESS", "DOCUMENT_EXISTS", "EMAIL_EXISTS"
Antes (LoginController con lógica de BD):
@FXML
void login(MouseEvent event) {
// Conexión directa a BD
JDBCConnectionPool pool = new JDBCConnectionPool(...);
Connection connection = pool.checkOut();
Statement statement = connection.createStatement();
ResultSet status = statement.executeQuery("SELECT * FROM user...");
// Lógica mezclada
}Después (LoginController delgado):
public class LoginController {
private AuthenticationService authService;
public LoginController() {
this.authService = new AuthenticationService();
}
@FXML
void login(MouseEvent event) {
String email = txtFieldEmailLogin.getText();
String password = pswdFieldPasswordLogin.getText();
// Delega al servicio
User user = authService.authenticate(email, password);
if (user != null) {
// Éxito
} else {
// Error
}
}
}Archivos FXML:
<!-- Antes -->
stylesheets="@../resources/css/application.css"
<Image url="@../resources/images/logo.png" />
<!-- Después -->
stylesheets="@../css/application.css"
<Image url="@../images/logo.png" />Código Java:
// Antes
FXMLLoader.load(getClass().getResource("/com/healingtouch/view/Manager.fxml"))
// Después (mismo - no cambió)
FXMLLoader.load(getClass().getResource("/com/healingtouch/view/Manager.fxml"))<!-- Antes -->
<sourceDirectory>src</sourceDirectory>
<!-- Después -->
<sourceDirectory>src/main/java</sourceDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources><dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>17.0.2</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>17.0.2</version>
</dependency>- Controladores: Solo manejo de UI
- Servicios: Lógica de negocio
- Repositorios: Acceso a datos
- Modelos: Entidades de dominio
// Fácil crear tests unitarios
@Test
public void testAuthentication() {
AuthenticationService service = new AuthenticationService();
User user = service.authenticate("test@example.com", "password");
assertNotNull(user);
}- Cambiar BD: Solo modificar repositorios
- Cambiar lógica: Solo modificar servicios
- Cambiar UI: Solo modificar controladores y FXML
Los servicios y repositorios pueden usarse desde cualquier controlador:
// En cualquier controlador
AuthenticationService authService = new AuthenticationService();
User user = authService.authenticate(email, password);# Compilar
mvn clean compile
# Empaquetar
mvn clean package
# Ejecutar (con JavaFX)
mvn javafx:run
# Saltar tests
mvn clean package -DskipTests-
Agregar Tests Unitarios
src/test/java/com/healingtouch/ ├── service/ │ ├── AuthenticationServiceTest.java │ └── PatientServiceTest.java └── repository/ ├── UserRepositoryTest.java └── PatientRepositoryTest.java -
Mejorar Seguridad
- Usar
PreparedStatementen lugar deStatement - Hashear contraseñas (BCrypt)
- Validación de entrada
- Usar
-
Configuración Externa
- Archivo
application.propertiespara configuración - Variables de entorno para credenciales
- Archivo
-
Logging
- Agregar SLF4J + Logback
- Logs en lugar de printStackTrace()
-
Manejo de Excepciones
- Excepciones personalizadas
- Manejo centralizado de errores
- ✅ Todas las vistas FXML funcionan igual
- ✅ Todos los controladores de UI mantienen funcionalidad
- ✅ Modelos no han cambiado
- ✅ Pool de conexiones sigue funcionando
⚠️ La clase principal cambió de nombre⚠️ Rutas de recursos en FXML actualizadas⚠️ Java 17 en lugar de Java 8
Solución: Asegurar que JavaFX esté en las dependencias del pom.xml
Solución: Verificar que javafx-fxml esté en las dependencias
Solución: Verificar que TrayTester.jar esté en lib/ y configurado en pom.xml
- Ver
ARCHITECTURE.mdpara descripción detallada de la arquitectura - Ver JavaDoc en las clases para documentación de métodos
- Ver diagramas UML (próximamente)
Fecha de Migración: Noviembre 2025
Versión: 2.0
Autor: Equipo de Desarrollo