TABLAS DE RAMAFLEX - CODIGO DE REFERENCIA EN JAVA
Especificacion: https://docurm.random.cl/integracion-erp.html#tablas (la regla es ../../pseudocodigo.txt)
ARCHIVOS
ramaflex/TablasRamaflex.java El nucleo, sin framework HTTP: validacion, SQL por motor, conversion de
tipos, transaccion y errores. Una entrada:
atender(metodo, tabla, parametros, cuerpo) -> Respuesta(estado, cuerpo JSON)
ramaflex/ServidorEjemplo.java Servidor minimo con el HttpServer del JDK. Monta {RUTA_BASE}/{TABLA}.
El servidor autentica y llama al nucleo. REEMPLACE la autenticacion de ejemplo (un token fijo en una
variable de entorno) por la de su API.
No hay archivo de catalogo: el script de las tablas guarda el catalogo en la base
(XESQUEMA.CATALOGO) y el nucleo lo lee de ahi, y lo vuelve a leer cada minuto.
REQUISITOS
Probado con Java 11 (11.0.26) y el servidor del JDK (ServidorEjemplo). Usa Jackson (jackson-databind,
que trae jackson-core y jackson-annotations) y el driver JDBC de su motor. Versiones probadas:
Jackson (todos): com.fasterxml.jackson.core:jackson-databind:2.17.2
SQL Server: com.microsoft.sqlserver:mssql-jdbc:12.8.1.jre11
(autenticacion integrada de Windows: ademas la DLL
com.microsoft.sqlserver:mssql-jdbc_auth:12.8.1.x64, tipo dll, en -Djava.library.path)
PostgreSQL: org.postgresql:postgresql:42.7.4
MySQL: com.mysql:mysql-connector-j:8.4.0
Maven:
com.fasterxml.jackson.core
jackson-databind
2.17.2
com.microsoft.sqlserver
mssql-jdbc
12.8.1.jre11
Gradle:
implementation 'com.fasterxml.jackson.core:jackson-databind:2.17.2'
implementation 'com.microsoft.sqlserver:mssql-jdbc:12.8.1.jre11' // o org.postgresql:postgresql:42.7.4
// o com.mysql:mysql-connector-j:8.4.0
En produccion use un pool de conexiones (HikariCP o el DataSource de su servidor de aplicaciones):
new TablasRamaflex("sqlserver", dataSource::getConnection)
CONFIGURACION (ServidorEjemplo, variables de entorno)
RAMAFLEX_MOTOR sqlserver | postgresql | mysql
RAMAFLEX_CONEXION cadena JDBC, por ejemplo:
jdbc:sqlserver://servidor;databaseName=ERP;user=...;password=...;encrypt=true
jdbc:postgresql://servidor:5432/erp?user=...&password=...
jdbc:mysql://servidor:3306/erp?user=...&password=...
RAMAFLEX_TOKEN token de servicio esperado en "Authorization: Bearer " (solo el ejemplo)
RAMAFLEX_RUTA_BASE por defecto /ramaflex/tablas (nos la informan)
RAMAFLEX_PUERTO por defecto 8080
Notas por motor:
- Fechas: se guardan en UTC sin zona y el codigo usa LocalDateTime, que no aplica la zona de la JVM.
No las cambie por java.sql.Timestamp.
- SQL Server: los textos viajan como NVARCHAR (setNString) para guardar la ñ y las tildes.
- MySQL: con mysql-connector-j 8.4.0, LocalDateTime viaja sin conversion de zona. Tablas en utf8mb4,
como las crea el script.
COMPILAR Y CORRER (sin Maven, con los .jar en la carpeta lib/)
Windows (en Linux/macOS cambie ";" por ":"):
javac -encoding UTF-8 -d clases -cp "lib/*" ramaflex/TablasRamaflex.java ramaflex/ServidorEjemplo.java
java -cp "clases;lib/*" ramaflex.ServidorEjemplo
PRUEBA DE CONFORMIDAD (probada con Node 16, 18 y 24; contra una base de PRUEBA con el script de las tablas aplicado)
node ../../conformidad.js http://localhost:8080/ramaflex/tablas
Deben pasar todas las pruebas. Si monta el nucleo en otro servidor, mantenga lo que hace ServidorEjemplo
al responder: si la llamada pide "Connection: close", la respuesta tambien lo dice (el HttpServer del JDK,
sin eso, corta una de cada dos conexiones; la prueba lo detecta). Corrala con el servidor en la zona horaria de su equipo (no en UTC): asi
detecta un corrimiento de zona en las fechas.
CON CADA VERSION NUEVA DEL SCRIPT
Ejecutar en la base el script nuevo del motor (migraciones/.sql). Nada mas: crea solo lo
que falta, guarda el catalogo nuevo en XESQUEMA y el nucleo lo toma solo, en menos de un minuto.
No hay que reiniciar ni cambiar el codigo.