3. Historial de Cambios
| Expandir |
|---|
| title | Versión 2.3.1 (JDK 1.7) / 3.1.1 (JDK 21): Protección contra consultas sin filtro en búsquedas (OTARQ-2053) |
|---|
|
- Resolución de la incidencia OTARQ-2053. Se retornaban datos incorrectos cuando se proporcionaba a los servicios que filtran por código o nombre, parámetros nulos o vacíos. Por ejemplo, al filtrar una zona básica por código, y este llegaba a nulo o vacío, internamente se obtenían todas las zonas básicas al no incorporarse en el filtro el código sobre el que filtrar, y el servicio retornaba el primer elemento de la colección obtenida. Tras la corrección, en caso de proporcionarse un valor nulo o vacío en el parámetro, el servicio retornará como resultado nulo, o una lista vacía según el contrato.
- Cambios realizados:
- Capa de servicio (AbstractServiceImpl)
- Centralización de la validación isInvalidCode(Object) para detectar códigos nulos, vacíos o en blanco.
- Añadidos helpers getEmptyFuture y getEmptyListFuture para retornar resultados vacíos sin ejecutar consulta.
- Añadidos helpers estáticos isValidAllParams y isValidSomeParams para validación de múltiples parámetros.
- Definición de constantes STATUS_ACTIVO ("0") y STATUS_PASIVO ("1") en sustitución de literales hardcodeados utilizados por los ServiceImpl.
- ServiceImpl
- Todos los ServiceImpl añaden guards en métodos ByCodigo y ByNombre para retornar null o lista vacía sin ejecutar la consulta cuando el parámetro proporcionado es inválido (nulo o "").
- NameCriteria
- Utilización de un valor centinela (Long.MIN_VALUE) cuando el código es null, vacío o en blanco, forzando un filtro que no devuelve resultados. Salvaguarda adicional que solo se activaría si los servicios no estuvieran protegidos con un guard.
- Método addCode() modificado para validar códigos y prevenir duplicados mediante containsCode()
- Método setCode() modificado para delegar en addCode() aplicando la misma validación.
- Método setCodes() modificado para filtrar elementos inválidos e insertar el centinela si la lista resultante es vacía.
- Nuevos tests unitarios:
- Incluidos tests para AbstractServiceImpl (isInvalidCode, isValidAllParams, isValidSomeParams, getEmptyListFuture, getEmptyFuture).
- Incluidos tests para NameCriteria (addCode, setCode, setCodes con valores inválidos y centinela).
- Incluidos tests para los guards de ServiceImpl en todos los servicios.
|
| Expandir |
|---|
| title | Versión 2.3.0 (JDK 1.7) / 3.1.0 (JDK 21): Obtención de REGCESS en centros y cambio en ORM (OTARQ-2629 / OTARQ-2560) |
|---|
|
- Resolución de la incidencia OTARQ-2629. No se retornaba el campo REGCESS en las entidades:
- CentroPrivadoEspecializada
- CentroEspecializada
- CentroPrimaria
- Reconfiguración del ORM. Adecuación de la separación de entidades por unidad de persistencia. Uso de sinónimos para referenciar las entidades (OTARQ-2560).
- Eliminación de la relación entre EClaveMedica y BClaveMedica, al tratarse de entidades gestionadas por diferentes unidades de persistencia (OTARQ-2560). Esta circunstancia se ha detectado tras la segregación física de los esquemas asociados a BDU y Estructura.
- Eliminación de entidades correspondientes a BDU:
- Ajustes y correcciones en Tests
|
| Expandir |
|---|
| title | Versión 2.2.5 (JDK 1.7) / 3.0.3 (JDK 21): Incrementos en DispositivoApoyoService y MunicipioService (OTARQ-2558) |
|---|
|
- Servicio modificado: DispositivoApoyoService
- FutureTask<List<DispositivoApoyo>> getDispositivosApoyoByDistrito(Context context, String codigoDistrito);
- FutureTask<List<DispositivoApoyo>> getDispositivosApoyoPasivosByDistrito(Context context, String codigoDistrito);
- Servicio modificado: MunicipioService
- FutureTask<Municipio> getMunicipioByCentroAtencionPrimaria(Context c, String codigoCentroAP);
- FutureTask<Municipio> getMunicipioByCodigoDispositivoApoyo(Context c, String codigoDispositivoApoyo);
|
| Expandir |
|---|
| title | Versión 2.2.4 (JDK 1.7) / 3.0.2 (JDK 21): Incrementos en UbicacionService (OTARQ-2561) |
|---|
|
- Servicio modificado: UbicacionService
- FutureTask<List<Ubicacion>> getUbicacionesByLastUpdate(Context context, Date lastUpdate);
|
| Expandir |
|---|
| title | Versión 2.2.3 (JDK 1.7) / 3.0.1 (JDK 21): Nuevos servicios de centros privados y relaciones Unidad-Centro (ESTR-894) |
|---|
|
- Servicio añadido: CentroPrivadoEspecializadaService
- FutureTask<CentroPrivadoEspecializada> getCentroPrivadoByCodigo(Context context, Long codigo);
- FutureTask<CentroPrivadoEspecializada> getCentroPrivadoByAhCodigo(Context context, String codigoAreaHospitalaria);
- FutureTask<CentroPrivadoEspecializada> getCentrosPrivadosByNombre(Context context, String nombre);
- FutureTask<List<CentroPrivadoEspecializada>> getCentrosPrivadosByProvincia(Context context, Long provincia);
- Servicio añadido: UnidadCentroService
- FutureTask<List<UnidadCentro>> getUnidadCentroByUnidad(Context context, String codigoUnidadFuncional);
- Servicio añadido: DireccionService
- FutureTask<Address> getDireccionByCodigo(Context context, String codigo);
- FutureTask<List<Address>> getDireccionByCodigoPostal(Context context, String codigoPostal);
- FutureTask<List<Address>> getDireccionByProvincia(Context context, Long provincia);
- FutureTask<List<Address>> getDireccionByMunicipio(Context context, Long municipio);
|
| Expandir |
|---|
| title | Versión 2.2.2 (JDK 1.7) / 3.0.0 (JDK 21): Ampliación de tipos de ubicación |
|---|
|
- Fix para ZonaBasica con código a null daba un comportamiento inesperado.
- Creación de variante del componente para JDK 21 y Jakarta 10. Testeada la ejecución en openliberty 24.X.X.X.
- Enum modificado: TipoUbicacionEnum
- Nuevos valores añadidos:
- CAMA_DE_COMUNIDAD_TERAPEUTICA
- PLANTA, PUESTO_DEL_PLAN_DE_CATASTROFES
- DESPACHO_ADMINISTRATIVO
- PUESTO_DE_ATENCION_DOMICILIARIA
- CAMA_DE_UCI_ADULTO
- CAMA_DE_UCI_PEDIATRICA
- CAMA_DE_HDM_ADULTO
- CAMA_DE_HDQ_ADULTO
- CAMA_DE_HDM_PEDIATRICA
- CAMA_DE_HDQ_PEDIATRICA
- CAMA_PEDIATRICA
- CAMA_DE_REANIMACION
- SILLON_DE_HDM_PEDIATRICO
- SILLON_DE_HDQ_PEDIATRICO
- SILLON_DE_REANIMACION
- PUESTO_DE_SALUD_MENTAL
- CAMA_PLAN_DE_CONTINGENCIA
- CAMA_UCI_PLAN_DE_CONTINGENCIA
- CAMA_DE_REANIMACION_PEDIATRICA
- CAMA_PREALTA
- SILLON_PREALTA
|
| Expandir |
|---|
| title | Versión 2.2.1: Mantenimiento y corrección |
|---|
|
- Core
- Resolución de la incidencia OTARQ-754.
- Actualización del mapper de `Localidad` para soportar campos nulos.
|
| Expandir |
|---|
| title | Versión 2.2.0: Nuevos servicios de geolocalización ampliada y códigos postales/vías |
|---|
|
- Servicio añadido: LocalidadService
- FutureTask<Localidad> getLocalidadByCodigo(Context ctx, String codigoLocalidad);
- FutureTask<List<Localidad>> getLocalidades(Context ctx);
- FutureTask<List<Localidad>> getLocalidadesByNombre(Context ctx, String nameFilter);
- FutureTask<List<Localidad>> getLocalidadesByMunicipio(Context ctx, String codigoMun);
- FutureTask<List<Localidad>> getLocalidadesByProvincia(Context ctx, String codigoProv);
- FutureTask<List<Localidad>> getLocalidadesByEntidadSingular(Context ctx, String codigo);
- FutureTask<List<Localidad>> getLocalidadesByEntidadColectiva(Context ctx, String codigo);
- FutureTask<List<Localidad>> getLocalidadesByNucleo(Context ctx, String codigo);
- FutureTask<List<Localidad>> getLocalidadesByStatus(Context ctx, Boolean pasivo);
- FutureTask<List<Localidad>> searchLocalidadesByCriteria(Context ctx, T criteria);
- FutureTask<List<Localidad>> searchLocalidadesByCriteria(Context ctx, T criteria, Integer page, Integer sizePerPage);
- Servicio añadido: MunicipioService
- FutureTask<Municipio> getMunicipioByCodigo(Context c, String codigo);
- FutureTask<List<Municipio>> getMunicipiosByProvincia(Context c, String codigo);
- FutureTask<List<Municipio>> getMunicipiosByNombre(Context c, String searchString);
- FutureTask<List<Municipio>> getMunicipiosByStatus(Context c, Boolean pasivo);
- FutureTask<List<Municipio>> searchMunicipiosByCriteria(Context c, C criteria);
- Servicio añadido: CodigoPostalService
- FutureTask<List<CodigoPostal>> getCodigosPostales(Context ctx, Long codigoPostal, String nombreLocalidad, Long codigoMunicipio, Long codigoProvincia);
- FutureTask<List<CodigoPostal>> getCodigoPostalByLocalidad(Context context, String codigoLocalidad);
- FutureTask<List<CodigoPostal>> getCodigoPostalByCode(Context context, String code);
- FutureTask<List<CodigoPostal>> getCodigoPostalByMunicipioPostalCode(Context context, String municipioPostaCode);
- FutureTask<List<CodigoPostal>> searchCodigoPostalByCriteria(Context context, T criteria);
- Servicio añadido: TiposViaService
- FutureTask<List<TipoVia>> getTiposVia(Context ctx);
- FutureTask<List<TipoVia>> getTiposVia(Context ctx, String codigo, String descripcion);
- FutureTask<TipoVia> getTipoViaByCodigo(Context c, String codigo);
- FutureTask<List<TipoVia>> getTipoViaByIneType(Context c, String ineType);
- FutureTask<List<TipoVia>> getTipoViaByNombre(Context c, String nombre);
- FutureTask<List<TipoVia>> getTipoViaByCriteria(Context c, C criteria);
- Servicio añadido: PaisService
- FutureTask<List<Pais>> getPaises(Context ctx);
- FutureTask<Pais> getPaisByCodigo(Context ctx, String codigo);
- FutureTask<List<Pais>> getPaisesByNombre(Context c, String searchString);
- FutureTask<List<Pais>> getPaisesByStatus(Context c, Boolean pasivo);
- FutureTask<List<Pais>> searchPaisesByCriteria(Context c, C criteria);
- Servicio añadido: NacionalidadService
- FutureTask<List<Nacionalidad>> getNacionalidades(Context ctx);
- FutureTask<Nacionalidad> getNacionalidadByCodigo(Context ctx, String codigo);
- FutureTask<Nacionalidad> getNacionalidadByPais(Context c, String paisCodigo);
- FutureTask<List<Nacionalidad>> getNacionalidadByStatus(Context c, Boolean pasivo);
- FutureTask<List<Nacionalidad>> getNacionalidadesByNombre(Context c, String searchString);
- FutureTask<List<Nacionalidad>> searchNacionalidadesByCriteria(Context c, C criteria);
|
| Expandir |
|---|
| title | Versión 2.1.4: Multiple fixes |
|---|
|
- Actualización de las dependencias:
- sas-utils:2.0.2
- macoApiClient:2.0.0
|
| Expandir |
|---|
| title | Versión 2.1.2.2: Mantenimiento |
|---|
|
- Ajustes y fixes en los descriptores pom.xml.
- Cambios de versión de dependencias subyacentes.
|
| Expandir |
|---|
| title | Versión 2.1.2.1: Añadido servicio para consulta de Zonas Básicas |
|---|
|
- Servicio añadido: ZonaBasicaService:
- FutureTask<ZonaBasica> getZonaBasicaByCodigo(Context ctx, String codigo);
- FutureTask<List<ZonaBasica>> getZonasBasicasByDistrito(Context c, String codigo);
- FutureTask<List<ZonaBasica>> getZonasBasicasReconvertidas(Context c, Boolean reconvertida, Date fechaDesde, Date fechaHasta);
- FutureTask<List<ZonaBasica>> getZonasBasicasByTipo(Context c, TipoZonaBasicaEnum tipo);
- FutureTask<List<ZonaBasica>> getZonasBasicas(Context c);
- FutureTask<List<ZonaBasica>> getZonasBasicasByCriteria(Context c, C criteria);
- Servicio modificado: UnidadFuncionalEspecializadaService:
- FutureTask<List<UnidadFuncionalEspecializada>> getUnidadesFuncionalesByFinalStatus(Context context, Boolean isFinal);
- FutureTask<List<UnidadFuncionalEspecializada>> searchUnidadesFuncionalesEspecializada(Context context, String nombre, String codigoCentro, String codigoAreaHospitalaria, Boolean isFinal);
|
| Expandir |
|---|
| title | Versión 2.1.0.1: Añadido servicio para consulta de Dispositivos de Apoyo |
|---|
|
- Servicio añadido: DispositivoApoyoService
- FutureTask<DispositivoApoyo> getDispositivoApoyoByCodigo(Context context, String codigo);
- FutureTask<List<DispositivoApoyo>> getDispositivosApoyo(Context context);
- FutureTask<List<DispositivoApoyo>> getDispositivosApoyoByCentroAPActividad(Context context, String codigoCentroAP);
- FutureTask<List<DispositivoApoyo>> getDispositivosApoyoByCentroAPSede(Context context, String codigoCentroAP);
- FutureTask<List<DispositivoApoyo>> getDispositivosApoyoByNombre(Context context, String nombre);
|
Versión 2.2.2: Añadidos enums variados.Versión 2.2.1: Fix para nucleos de localidad nulos. Versión 2.2.0: Se añaden servicios para la consulta de códigos postales, localidades, paises y vias.Version 2.1.3.1: Se añaden los tipos de centro para los centros de especializada.Versión 2.1.1.1: Cambios menoresVersión 2.1.0.1: Añadido servicio para consulta de Dispositivos de Apoyo- Servicio añadido: DispositivoApoyoService
- public FutureTask<DispositivoApoyo> getDispositivoApoyoByCodigo(Context context, String codigo);
- public FutureTask<List<DispositivoApoyo>> getDispositivosApoyo(Context context);
- public FutureTask<List<DispositivoApoyo>> getDispositivosApoyoByCentroAPActividad(Context context, String codigoCentroAP);
- public FutureTask<List<DispositivoApoyo>> getDispositivosApoyoByCentroAPSede(Context context, String codigoCentroAP);
- public FutureTask<List<DispositivoApoyo>> getDispositivosApoyoByNombre(Context context, String nombre);
- Añadida propiedad tipoCentro a la entidad CentroEspecializada, necesario para especificar el tipo de centro consultado
Versión 2.0.0.1: Acceso a información de Estructura- Cambios realizados
- Se dividen los servicios existentes en la API para ofrecer servicios más cohesionados y fáciles de mantener.
- Se modifica la filosofía de uso de la librería, se publican todos los servicios haciendo uso de Futures, los cuales permiten realizar programación multihilo que mejoren el rendimiento del sistema.
- Se crea el objeto EstructuraApiConfig como contenedor de configuración de parámetros de la librería.
- Servicios ofrecidos
- Area Conocimiento
- public FutureTask<AreaConocimiento> getAreaConocimientoByCodigo(Context context, String codigo);
- public FutureTask<List<AreaConocimiento>> getAreasConocimiento(Context context);
- public FutureTask<List<AreaConocimiento>> getAreasConocimientoByNombre(Context context, String nombre);
- Area Hospitalaria
- public FutureTask<List<AreaHospitalaria>> getAreasHospitalarias(Context context, TipoGestionAreaHospitalariaEnum tipoGestion);
- public FutureTask<List<AreaHospitalaria>> getAreasHospitalariasByNombre(Context context, TipoGestionAreaHospitalariaEnum tipoGestion, String nombre);
- public FutureTask<AreaHospitalaria> getAreaHospitalariaByCodigo(Context context, TipoGestionAreaHospitalariaEnum tipoGestion, String codigo);
- Centro Especializada
- public FutureTask<CentroEspecializada> getCentroEspecializadaByCodigo(Context context, String codigo);
- public FutureTask<List<CentroEspecializada>> getCentrosEspecializada(Context context);
- public FutureTask<List<CentroEspecializada>> getCentrosEspecializadaByArea(Context context, String codigoArea);
- public FutureTask<List<CentroEspecializada>> getCentrosEspecializadaByNombre(Context context, String nombre);
- public FutureTask<List<CentroEspecializada>> getCentrosEspecializadaByUnidadFuncional(Context context, String codigoUnidadFuncional);
- Centro Primaria
- public FutureTask<CentroPrimaria> getCentroPrimariaByCodigo(Context context, String codigo);
- public FutureTask<List<CentroPrimaria>> getCentrosPrimariaByCodigoPostal(Context context, Long codigoPostal);
- public FutureTask<List<CentroPrimaria>> getCentrosPrimariaByDistrito(Context context, Long distrito);
- public FutureTask<List<CentroPrimaria>> getCentrosPrimariaByLocalidad(Context context, Long localidad);
- public FutureTask<List<CentroPrimaria>> getCentrosPrimariaByMunicipio(Context context, Long municipio);
- public FutureTask<List<CentroPrimaria>> getCentrosPrimariaByNombre(Context context, String nombre);
- public FutureTask<List<CentroPrimaria>> getCentrosPrimariaByZonaBasica(Context context, Long zonaBasica);
- Comunidad Autonoma
- public FutureTask<ComunidadAutonoma> getComunidadAutonomaByCodigo(Context context, String codigo);
- public FutureTask<List<ComunidadAutonoma>> getComunidadesAutonomas(Context context);
- public FutureTask<List<ComunidadAutonoma>> getComunidadesAutonomasByNombre(Context context, String nombre);
- Distrito
- public FutureTask<Distrito> getDistritoByCodigo(Context context, String codigo);
- public FutureTask<List<Distrito>> getDistritos(Context context);
- public FutureTask<List<Distrito>> getDistritosByMunicipio(Context context, String codigoMunicipio);
- public FutureTask<List<Distrito>> getDistritosByNombre(Context context, String nombre);
- public FutureTask<List<Distrito>> getDistritosByProvincia(Context context, String codigoProvincia);
- Especialidad
- public FutureTask<Especialidad> getEspecialidadByCodigo(Context context, String codigo);
- public FutureTask<Especialidad> getEspecialidadByUnidadFuncional(Context context, String codigoUnidadFuncional);
- public FutureTask<List<Especialidad>> getEspecialidadByNombre(Context context, String nombre);
- public FutureTask<List<Especialidad>> getEspecialidades(Context context);
- Provincia
- public FutureTask<Provincia> getProvinciaByCodigo(Context context, String codigo);
- public FutureTask<List<Provincia>> getProvincias(Context context);
- public FutureTask<List<Provincia>> getProvinciasByComunidadAutonoma(Context context, String codigoComunidadAutonoma);
- public FutureTask<List<Provincia>> getProvinciasByNombre(Context context, String nombre);
- Tipo Asistencia
- public FutureTask<TipoAsistencia> getTipoAsistenciaByCodigo(Context context, String codigo);
- public FutureTask<List<TipoAsistencia>> getTiposAsistencia(Context context);
- public FutureTask<List<TipoAsistencia>> getTiposAsistenciasByCentroAP(Context context, String codigoCentroAP);
- public FutureTask<List<TipoAsistencia>> getTiposAsistenciasByNombre(Context context, String nombre);
- Tipo Profesional
- public FutureTask<TipoProfesional> getTipoProfesionalByCodigo(Context context, String codigo);
- public FutureTask<List<TipoProfesional>> getTiposProfesionales(Context context);
- public FutureTask<List<TipoProfesional>> getTiposProfesionalesByNombre(Context context, String nombre);
- Ubicacion
- public FutureTask<Ubicacion> getUbicacionByCodigo(Context context, TipoUbicacionEnum tipo, String codigo);
- public FutureTask<List<Ubicacion>> getUbicaciones(Context context, TipoUbicacionEnum tipo);
- public FutureTask<List<Ubicacion>> getUbicacionesByArea(Context context, TipoUbicacionEnum tipo, String codigoAreaHospitalaria);
- public FutureTask<List<Ubicacion>> getUbicacionesByCentro(Context context, TipoUbicacionEnum tipo, Long codigoCentro);
- public FutureTask<List<Ubicacion>> getUbicacionesByNombre(Context context, TipoUbicacionEnum tipo, String nombre);
- public FutureTask<List<Ubicacion>> getUbicacionesByPadre(Context context, TipoUbicacionEnum tipo, String codigoPadre);
- Unidad Funcional Especializada
- public FutureTask<UnidadFuncionalEspecializada> getUnidadFuncionalByCodigo(Context context, String codigo);
- public FutureTask<List<UnidadFuncionalEspecializada>> getUnidadesFuncionales(Context context);
- public FutureTask<List<UnidadFuncionalEspecializada>> getUnidadesFuncionalesByArea(Context context, String codigoAreaHospitalaria);
- public FutureTask<List<UnidadFuncionalEspecializada>> getUnidadesFuncionalesByCentro(Context context, String codigoCentro);
- public FutureTask<List<UnidadFuncionalEspecializada>> getUnidadesFuncionalesByNombre(Context context, String nombre);
- Unidad Funcional Primaria
- public FutureTask<UnidadFuncionalPrimaria> getUnidadFuncionalByCodigo(Context context, String codigo);
- public FutureTask<List<UnidadFuncionalPrimaria>> getUnidadesFuncionales(Context context);
- public FutureTask<List<UnidadFuncionalPrimaria>> getUnidadesFuncionalesByCentroAPActividad(Context context, String codigoCentroAP);
- public FutureTask<List<UnidadFuncionalPrimaria>> getUnidadesFuncionalesByCentroAPSede(Context context, String codigoCentroAP);
- public FutureTask<List<UnidadFuncionalPrimaria>> getUnidadesFuncionalesByNombre(Context context, String nombre);
Versión 1.1.0.1: Acceso a información de Estructura- Atención Especializada
- public List<AreaHospitalaria> getAreasHospitalarias(Context context, TipoGestionAreaHospitalariaEnum tipoGestion);
- public List<AreaHospitalaria> getAreasHospitalariasByNombre(Context context, TipoGestionAreaHospitalariaEnum tipoGestion, String nombre);
- public AreaHospitalaria getAreaHospitalariaByCodigo(Context context, TipoGestionAreaHospitalariaEnum tipoGestion, String codigo);
- public CentroEspecializada getCentroEspecializadaByCodigo(Context context, String codigo);
- public List<CentroEspecializada> getCentrosEspecializada(Context context);
- public List<CentroEspecializada> getCentrosEspecializadaByArea(Context context, String codigoArea);
- public List<CentroEspecializada> getCentrosEspecializadaByNombre(Context context, String nombre);
- public List<CentroEspecializada> getCentrosEspecializadaByUnidadFuncional(Context context, String codigoUnidadFuncional);
- public Especialidad getEspecialidadByCodigo(Context context, String codigo);
- public Especialidad getEspecialidadByUnidadFuncional(Context context, String codigoUnidadFuncional);
- public List<Especialidad> getEspecialidadByNombre(Context context, String nombre);
- public List<Especialidad> getEspecialidades(Context context);
- public Ubicacion getUbicacionByCodigo(Context context, TipoUbicacionEnum tipo, String codigo);
- public List<Ubicacion> getUbicaciones(Context context, TipoUbicacionEnum tipo);
- public List<Ubicacion> getUbicacionesByArea(Context context, TipoUbicacionEnum tipo, String codigoAreaHospitalaria);
- public List<Ubicacion> getUbicacionesByCentro(Context context, TipoUbicacionEnum tipo, Long codigoCentro);
- public List<Ubicacion> getUbicacionesByNombre(Context context, TipoUbicacionEnum tipo, String nombre);
- public List<Ubicacion> getUbicacionesByPadre(Context context, TipoUbicacionEnum tipo, String codigoPadre);
- public UnidadFuncionalEspecializada getUnidadFuncionalByCodigo(Context context, String codigo);
- public List<UnidadFuncionalEspecializada> getUnidadesFuncionales(Context context);
- public List<UnidadFuncionalEspecializada> getUnidadesFuncionalesByArea(Context context, String codigoAreaHospitalaria);
- public List<UnidadFuncionalEspecializada> getUnidadesFuncionalesByCentro(Context context, String codigoCentro);
- public List<UnidadFuncionalEspecializada> getUnidadesFuncionalesByNombre(Context context, String nombre);
- Atención Primaria
- public AreaConocimiento getAreaConocimientoByCodigo(Context context, String codigo);
- public List<AreaConocimiento> getAreasConocimiento(Context context);
- public List<AreaConocimiento> getAreasConocimientoByNombre(Context context, String nombre);
- public CentroPrimaria getCentroPrimariaByCodigo(Context context, String codigo);
- public List<CentroPrimaria> getCentrosPrimariaByCodigoPostal(Context context, Long codigoPostal);
- public List<CentroPrimaria> getCentrosPrimariaByDistrito(Context context, Long distrito);
- public List<CentroPrimaria> getCentrosPrimariaByLocalidad(Context context, Long localidad);
- public List<CentroPrimaria> getCentrosPrimariaByMunicipio(Context context, Long municipio);
- public List<CentroPrimaria> getCentrosPrimariaByNombre(Context context, String nombre);
- public List<CentroPrimaria> getCentrosPrimariaByZonaBasica(Context context, Long zonaBasica);
- public Distrito getDistritoByCodigo(Context context, String codigo);
- public List<Distrito> getDistritos(Context context);
- public List<Distrito> getDistritosByMunicipio(Context context, String codigoMunicipio);
- public List<Distrito> getDistritosByNombre(Context context, String nombre);
- public List<Distrito> getDistritosByProvincia(Context context, String codigoProvincia);
- public TipoAsistencia getTipoAsistenciaByCodigo(Context context, String codigo);
- public List<TipoAsistencia> getTiposAsistencia(Context context);
- public List<TipoAsistencia> getTiposAsistenciasByCentroAP(Context context, String codigoCentroAP);
- public List<TipoAsistencia> getTiposAsistenciasByNombre(Context context, String nombre);
- public TipoProfesional getTipoProfesionalByCodigo(Context context, String codigo);
- public List<TipoProfesional> getTiposProfesionales(Context context);
- public List<TipoProfesional> getTiposProfesionalesByNombre(Context context, String nombre);
- public UnidadFuncionalPrimaria getUnidadFuncionalByCodigo(Context context, String codigo);
- public List<UnidadFuncionalPrimaria> getUnidadesFuncionales(Context context);
- public List<UnidadFuncionalPrimaria> getUnidadesFuncionalesByCentroAPActividad(Context context, String codigoCentroAP);
- public List<UnidadFuncionalPrimaria> getUnidadesFuncionalesByCentroAPSede(Context context, String codigoCentroAP);
- public List<UnidadFuncionalPrimaria> getUnidadesFuncionalesByNombre(Context context, String nombre);
- Geolocalizacion
- public ComunidadAutonoma getComunidadAutonomaByCodigo(Context context, String codigo);
- public List<ComunidadAutonoma> getComunidadesAutonomas(Context context);
- public List<ComunidadAutonoma> getComunidadesAutonomasByNombre(Context context, String nombre);
- public Provincia getProvinciaByCodigo(Context context, String codigo);
- public List<Provincia> getProvincias(Context context);
- public List<Provincia> getProvinciasByComunidadAutonoma(Context context, String codigoComunidadAutonoma);
- public List<Provincia> getProvinciasByNombre(Context context, String nombre);
- Versión 1.0.0.1: Acceso a información de Estructura
- EstructuraEspecializadaService
- AREAS_HOSPITALARIAS
- getAreaHospitalaria (Codigo)
- getAreasHospitalarias
- getAreasHospitalariasByNombre
- CENTROS_AH
- getCentroEspecializada(Codigo)
- getCentrosEspecializada(Codigo area)
- getCentrosEspecializada
- getCentrosEspecializadaByNombre
- getCentrosEspecializadaByUnidadFuncional(Unidad Funcional)
- ESPECIALIDADES
- getEspecialidad(Codigo)
- getEspecialidad(Todas)
- getEspecialidadByNombre(Nombre)
- getEspecialidadByUnidadFuncional(Unidad Funcional)
- UNIDADES_FUNCIONALES
- getUnidadesFuncionales()
- getUnidadFuncional(Codigo)
- getUnidadFuncionalByNombre(Nombre)
- getUnidadesFuncionalesByCentro(Centro)
- getUnidadesFuncionalesByArea(Area)
- UBICACIONES
- getUbicacionByCodigo(Tipo, Codigo)
- getUbicaciones(Tipo)
- getUbicacionesByNombre(Tipo, Nombre)
- getUbicacionesByArea(Tipo, Area)
- getUbicacionesByCentro(Tipo, Centro)
- getUbicacionesByPadre(CodPadre)
- EstructuraPrimariaService
- CENTROS_AP
- getCentroPrimariaByCodigo(Codigo)
- getCentrosPrimariaByNombre(Nombre)
- getCentrosPrimariaByZonaBasica(Zona basica)
- getCentrosPrimariaByCodigoPostal(Código postal)
- getCentrosPrimariaByMunicipio(Municipio)
- getCentrosPrimariaByLocalidad(Localidad)
4. Servicios ofrecidos
Área Conocimientopublic | Expandir |
|---|
| title | Versión 2.0.0.1: Acceso a información de Estructura |
|---|
|
- Cambios realizados
- Se dividen los servicios existentes en la API para ofrecer servicios más cohesionados y fáciles de mantener.
- Se modifica la filosofía de uso de la librería, se publican todos los servicios haciendo uso de Futures, los cuales permiten realizar programación multihilo que mejoren el rendimiento del sistema.
- Se crea el objeto EstructuraApiConfig como contenedor de configuración de parámetros de la librería.
- Servicios ofrecidos
|
- FutureTask<AreaConocimiento> getAreaConocimientoByCodigo(Context context, String codigo);
|
public - FutureTask<List<AreaConocimiento>> getAreasConocimiento(Context context);
|
public - FutureTask<List<AreaConocimiento>> getAreasConocimientoByNombre(Context context, String nombre);
|
Área public - FutureTask<List<AreaHospitalaria>> getAreasHospitalarias(Context context, TipoGestionAreaHospitalariaEnum tipoGestion);
|
public - FutureTask<List<AreaHospitalaria>> getAreasHospitalariasByNombre(Context context, TipoGestionAreaHospitalariaEnum tipoGestion, String nombre);
|
public - FutureTask<AreaHospitalaria> getAreaHospitalariaByCodigo(Context context, TipoGestionAreaHospitalariaEnum tipoGestion, String codigo);
- Centro Especializada
|
public - FutureTask<CentroEspecializada> getCentroEspecializadaByCodigo(Context context, String codigo);
|
public - FutureTask<List<CentroEspecializada>> getCentrosEspecializada(Context context);
|
public - FutureTask<List<CentroEspecializada>> getCentrosEspecializadaByArea(Context context, String codigoArea);
|
public - FutureTask<List<CentroEspecializada>> getCentrosEspecializadaByNombre(Context context, String nombre);
|
public - FutureTask<List<CentroEspecializada>> getCentrosEspecializadaByUnidadFuncional(Context context, String codigoUnidadFuncional);
- Centro Primaria
|
public - FutureTask<CentroPrimaria> getCentroPrimariaByCodigo(Context context, String codigo);
|
public - FutureTask<List<CentroPrimaria>> getCentrosPrimariaByCodigoPostal(Context context, Long codigoPostal);
|
public - FutureTask<List<CentroPrimaria>> getCentrosPrimariaByDistrito(Context context, Long distrito);
|
public - FutureTask<List<CentroPrimaria>> getCentrosPrimariaByLocalidad(Context context, Long localidad);
|
public - FutureTask<List<CentroPrimaria>> getCentrosPrimariaByMunicipio(Context context, Long municipio);
|
public - FutureTask<List<CentroPrimaria>> getCentrosPrimariaByNombre(Context context, String nombre);
|
public - FutureTask<List<CentroPrimaria>> getCentrosPrimariaByZonaBasica(Context context, Long zonaBasica);
- Comunidad Autonoma
|
public - FutureTask<ComunidadAutonoma> getComunidadAutonomaByCodigo(Context context, String codigo);
|
public - FutureTask<List<ComunidadAutonoma>> getComunidadesAutonomas(Context context);
|
public - FutureTask<List<ComunidadAutonoma>> getComunidadesAutonomasByNombre(Context context, String nombre);
- Distrito
|
public - FutureTask<Distrito> getDistritoByCodigo(Context context, String codigo);
|
public - FutureTask<List<Distrito>> getDistritos(Context context);
|
public - FutureTask<List<Distrito>> getDistritosByMunicipio(Context context, String codigoMunicipio);
|
public - FutureTask<List<Distrito>> getDistritosByNombre(Context context, String nombre);
|
public - FutureTask<List<Distrito>> getDistritosByProvincia(Context context, String codigoProvincia);
- Especialidad
|
public - FutureTask<Especialidad> getEspecialidadByCodigo(Context context, String codigo);
|
public - FutureTask<Especialidad> getEspecialidadByUnidadFuncional(Context context, String codigoUnidadFuncional);
|
public - FutureTask<List<Especialidad>> getEspecialidadByNombre(Context context, String nombre);
|
public - FutureTask<List<Especialidad>> getEspecialidades(Context context);
- Provincia
|
public - FutureTask<Provincia> getProvinciaByCodigo(Context context, String codigo);
|
public - FutureTask<List<Provincia>> getProvincias(Context context);
|
public - FutureTask<List<Provincia>> getProvinciasByComunidadAutonoma(Context context, String codigoComunidadAutonoma);
|
public - FutureTask<List<Provincia>> getProvinciasByNombre(Context context, String nombre);
- Tipo Asistencia
|
public - FutureTask<TipoAsistencia> getTipoAsistenciaByCodigo(Context context, String codigo);
|
public - FutureTask<List<TipoAsistencia>> getTiposAsistencia(Context context);
|
public - FutureTask<List<TipoAsistencia>> getTiposAsistenciasByCentroAP(Context context, String codigoCentroAP);
|
public - FutureTask<List<TipoAsistencia>> getTiposAsistenciasByNombre(Context context, String nombre);
- Tipo Profesional
|
public - FutureTask<TipoProfesional> getTipoProfesionalByCodigo(Context context, String codigo);
|
public - FutureTask<List<TipoProfesional>> getTiposProfesionales(Context context);
|
public - FutureTask<List<TipoProfesional>> getTiposProfesionalesByNombre(Context context, String nombre);
- Ubicacion
|
public - FutureTask<Ubicacion> getUbicacionByCodigo(Context context, TipoUbicacionEnum tipo, String codigo);
|
public - FutureTask<List<Ubicacion>> getUbicaciones(Context context, TipoUbicacionEnum tipo);
|
public - FutureTask<List<Ubicacion>> getUbicacionesByArea(Context context, TipoUbicacionEnum tipo, String codigoAreaHospitalaria);
|
public - FutureTask<List<Ubicacion>> getUbicacionesByCentro(Context context, TipoUbicacionEnum tipo, Long codigoCentro);
|
public - FutureTask<List<Ubicacion>> getUbicacionesByNombre(Context context, TipoUbicacionEnum tipo, String nombre);
|
public - FutureTask<List<Ubicacion>> getUbicacionesByPadre(Context context, TipoUbicacionEnum tipo, String codigoPadre);
- Unidad Funcional Especializada
|
public - FutureTask<UnidadFuncionalEspecializada> getUnidadFuncionalByCodigo(Context context, String codigo);
|
public - FutureTask<List<UnidadFuncionalEspecializada>> getUnidadesFuncionales(Context context);
|
public - FutureTask<List<UnidadFuncionalEspecializada>> getUnidadesFuncionalesByArea(Context context, String codigoAreaHospitalaria);
|
public - FutureTask<List<UnidadFuncionalEspecializada>> getUnidadesFuncionalesByCentro(Context context, String codigoCentro);
|
public - FutureTask<List<UnidadFuncionalEspecializada>> getUnidadesFuncionalesByNombre(Context context, String nombre);
- Unidad Funcional Primaria
|
public - FutureTask<UnidadFuncionalPrimaria> getUnidadFuncionalByCodigo(Context context, String codigo);
|
public - FutureTask<List<UnidadFuncionalPrimaria>> getUnidadesFuncionales(Context context);
|
public - FutureTask<List<UnidadFuncionalPrimaria>> getUnidadesFuncionalesByCentroAPActividad(Context context, String codigoCentroAP);
|
public - FutureTask<List<UnidadFuncionalPrimaria>> getUnidadesFuncionalesByCentroAPSede(Context context, String codigoCentroAP);
|
public - FutureTask<List<UnidadFuncionalPrimaria>> getUnidadesFuncionalesByNombre(Context context, String nombre);
|
Dispositivos de Apoyo| Expandir |
|---|
| title | Versión 1.1.0.1: Acceso a información de Estructura |
|---|
|
- Atención Especializada
- List<AreaHospitalaria> getAreasHospitalarias(Context context, TipoGestionAreaHospitalariaEnum tipoGestion);
- List<AreaHospitalaria> getAreasHospitalariasByNombre(Context context, TipoGestionAreaHospitalariaEnum tipoGestion, String nombre);
- AreaHospitalaria getAreaHospitalariaByCodigo(Context context, TipoGestionAreaHospitalariaEnum tipoGestion, String codigo);
- CentroEspecializada getCentroEspecializadaByCodigo
|
public FutureTask<DispositivoApoyo> getDispositivoApoyoByCodigo(Context context, String codigo);public FutureTask<List<DispositivoApoyo>> getDispositivosApoyo(Context context);public FutureTask<List<DispositivoApoyo>> getDispositivosApoyoByCentroAPActividad codigoCentroAP- codigo);
- List<CentroEspecializada> getCentrosEspecializada(Context context);
|
public FutureTask<List<DispositivoApoyo>> getDispositivosApoyoByCentroAPSede- List<CentroEspecializada> getCentrosEspecializadaByArea(Context context, String
|
codigoCentroAPpublic FutureTask<List<DispositivoApoyo>> getDispositivosApoyoByNombre- List<CentroEspecializada> getCentrosEspecializadaByNombre(Context context, String nombre);
|
5. Arquitectura de la librería
Puesto que a fecha de realización del presente documento los servicios web que ofrece Estructura para acceder a su información no permiten acceder a todo el catálogo de entidades almacenadas en Estructura, la única forma de acceder actualmente a dicha información es haciendo uso de Réplicas de base de datos.
Ya que el acceso a la información a través de réplicas de base de datos no está aconsejado por la gran dependencia que genera entre diferentes productos, la librería de acceso a la Estructura se ha desarrollado siguiendo un modelo de API/Implementación que permite exponer a los usuarios de la librería una API única que debe ser usada y una serie de implementaciones de dicha API, las cuales serán las verdaderas encargadas de acceder a la información.
Siguiendo este patrón se ha iniciado el desarrollo con una única implementación haciendo uso de réplicas (por ser la única forma posible actualmente), esperando que en un futuro se generen nuevas implementaciones que hagan uso de distintos métodos de acceso a Estructura (SOAP, REST, etc.). Los productos que estén ya desarrollados y haciendo uso de la API estándar podrán cambiar fácilmente de implementación si que el producto se vea afectado.
Requerimientos
| UI Expand |
|---|
|
Siguiendo la normativa vigente para desarrollo de aplicaciones Java en el SAS, la librería de acceso a estructura se ha implementado con Java 7 y ha sido testada en Oracle Weblogic 12.1.3, donde se ha creado proyectos de prueba que incorporan la librería a través de Maven. |
| UI Expand |
|---|
|
Siguiendo la normativa vigente para desarrollo de aplicaciones Java en el SAS, la librería de acceso a estructura se ha implementado con Java 21, Jakarta 10 y Microprofile 6.1 y ha sido testada en Openliberty 24.X.X.X, donde se ha creado proyectos de prueba que incorporan la librería a través de Maven. |
Instalación
La librería desarrollada se encuentra desplegada en el repositorio de artefactos corporativo pudiendo ser incorporada en nuestro proyecto haciendo uso de maven:
| UI Expand |
|---|
|
| Bloque de código |
|---|
| language | xml |
|---|
| title | Pom módulo uso |
|---|
| collapse | true |
|---|
| <!-- Añadir en caso de hacer uso de la interfaz-->
<dependencies>
<dependency>
<groupId>es.ja.csalud.sas.componentescomunes.estructuraApiClient</groupId>
<artifactId>estructuraApiClient-api</artifactId>
<version>${estructuraapi.version}</version><!-- Hasta la verisón 2.X.X-->
</dependency>
<!-- Añadir en caso de hacer uso de la implementación-->
<dependency>
<groupId>es.ja.csalud.sas.componentescomunes.estructuraApiClient</groupId>
<artifactId>estructuraApiClient-jpa</artifactId>
<version>${estructuraapi.version}</version><!-- Hasta la verisón 2.X.X-->
</dependency>
<dependencies>
|
|
| UI Expand |
|---|
|
| Bloque de código |
|---|
| language | xml |
|---|
| title | Pom Padre |
|---|
| collapse | true |
|---|
| <dependencyManagement>
<dependencies>
<dependency>
<groupId>es.ja.csalud.sas.componentescomunes.estructuraApiClient</groupId>
<artifactId>estructuraApiClient</artifactId>
<version>${estructuraapi.version}</version> <!-- A partir de la 3.X.X-->
<type>pom</type>
<scope>import</scope>
</dependency>
<dependencies>
<dependencyManagement> |
| Bloque de código |
|---|
| language | xml |
|---|
| title | Pom módulo uso |
|---|
| collapse | true |
|---|
| <!-- Añadir en caso de hacer uso de la interfaz-->
<dependencies>
<dependency>
<groupId>es.ja.csalud.sas.componentescomunes.estructuraApiClient</groupId>
<artifactId>estructuraApiClient-api</artifactId>
<version>${estructuraapi.version}</version><!-- A partir de la 3.X.X-->
</dependency>
<!-- Añadir en caso de hacer uso de la implementación-->
<dependency>
<groupId>es.ja.csalud.sas.componentescomunes.estructuraApiClient</groupId>
<artifactId>estructuraApiClient-jpa</artifactId>
<version>${estructuraapi.version}</version><!-- A partir de la 3.X.X-->
</dependency>
<dependencies>
|
|
Configuración
Antes de comenzar a configurar nuestro proyecto, conviene recordar que la implementación de la API desarrollada con la que se cuenta actualmente se basa en acceso a la información a partir de un origen de datos específico para el acceso a sus datos, mientras que por otro lado la aplicación podrá tener otro origen de datos distinto para acceder a sus datos, de esta forma la aplicación puede estar en una base de datos mientras que la información de estructura sea recuperada de otra distinta.
Dicho esto, y siendo consciente de que existen diferentes formas de hacer lo mismo, a continuación se expone una serie de instrucciones a seguir para configurar un proyecto web que haga uso de esta librería y que se ejecutará en un contenedor Weblogic:
Configurar origen de datos | UI Expand |
|---|
|
En Weblogic: El primer paso a seguir será configurar el origen de datos en Weblogic, donde debemos crear un origen de datos que tenga visibilidad con las tablas de réplicas de estructura alojados en un esquema llamado REP_PRO_EST. Por ejemplo, nuestro origen de datos podría llamarse "jdbc/Diraya-Estructura-DS" |
| UI Expand |
|---|
|
En Openliberty >= 24.X.X.X:
| Bloque de código |
|---|
| language | xml |
|---|
| title | server.xml |
|---|
| collapse | true |
|---|
|
<server>
....
<include location="persistence-config-oracle-estructura.xml" /> <!-- Se puede modificar el nombre del fichero por el que resulte más adecuado para el ejemplo usaremos este -->
....
</server> |
| Bloque de código |
|---|
| language | xml |
|---|
| title | persistence-config-oracle-estructura.xml |
|---|
| collapse | true |
|---|
|
<server>
<!-- Oracle driver -->
<jdbcDriver id="oracle19-driver" libraryRef="oracle19-library" />
<!-- Oracle driver library -->
<library id="oracle19-library">
<fileset dir="${server.config.dir}/lib/oracle" includes="ojdbc*.jar" />
</library>
<!-- Datasource -->
<dataSource id="oracle" jndiName="jdbc/Diraya-Estructura-DS" queryTimeout="20s">
<jdbcDriver libraryRef="oracle19-library"/>
<properties.oracle URL="${jdbc.url}" user="${jdbc.user}" password="${jdbc.password}" /> <!-- queda a criterio del programador determinar las variables correctas. En caso de contenerizar el servidor, se deberá hacer uso de las secret y configmap descritos en el helm de despliegue -->
</dataSource>
</server> |
Para que funcione la configuración de conexión a la bbdd se deben seguir las pautas del readme.md del arquetipo. En resumen:
| Bloque de código |
|---|
| language | xml |
|---|
| title | pom.xml del boot |
|---|
| collapse | true |
|---|
|
<plugins>
<plugin>
<groupId>io.openliberty.tools</groupId>
<artifactId>liberty-maven-plugin</artifactId>
<configuration>
<copyDependencies>
<dependencyGroup>
<location>lib/oracle</location>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc11</artifactId>
<version>${oracle.version}</version>
</dependency>
</dependencyGroup>
</copyDependencies>
</configuration>
</plugin> |
Configurar persistence.xml: Configurar el fichero persistence.xml de nuestro proyecto web para añadir el orígen de datos configurado previamente. En este fichero se le asignara un nombre a la unidad de persistencia que posteriormente usará nuestro código a través de JPA. En el siguiente extracto puede verse como se crea una unidad de persistencia llamada "Diraya-Estructura-Persistence-Unit" y que es mapeada con el origen de datos que creamos previamente:
| Bloque de código |
|---|
|
<persistence-unit name="Diraya-Estructura-Persistence-Unit" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/Diraya-Estructura-DS</jta-data-source>
<mapping-file>META-INF/est-bd-replica.xml</mapping-file>
<class>es.ja.csalud.sas.componentescomunes.estructura.impl.*</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
</persistence-unit> |
Es importante destacar que para aislar la unidad de persistencia del resto de la aplicación y evitar posibles conflictos, es recomendable añadir la etiqueta "class" y "exclude-unlisted-classes" con el valor que puede verse en el ejemplo para que la unidad de persistencia sólo actúe sobre el paquete indicado.
En cuanto al fichero de mapeo de entidades, pueden usarse cualquiera de los siguientes mapeos:- META-INF/est-bd-replica.xml: Cuando nuestra cadena de conexión apunte a una base de datos donde existe una réplica de estructura en el esquema REP_PRO_EST. Este será la configuración usada en la mayoría de los casos
- META-INF/est-bd-original.xml: Cuando nuestra cadena de conexión apunte directamente a la base de datos de Estructura
- Cualquier otra configuración requerirá que el fichero xml sea redefinido por la aplicación que hace uso de la librería
Asignar EntityManager a la librería: Una vez configurada la unidad de persistencia sólo nos quedaría indicarle a la librería cuál va a ser el contexto de persistencia que queremos que use, ya que como se ha mencionado previamente, nuestra aplicación puede tener varios orígenes de datos distintos. Para ello nuevamente existen diferentes formas de hacerlo, a continuación se muestra una manera muy simple consistente en crear una clase que es ejecutada al iniciar nuestro servidor y se encarga de asignarle a la librería el contexto de persistencia a usar. A partir de este momento nuestra librería es completamente funcional.
| UI Expand |
|---|
|
| Bloque de código |
|---|
| language | java |
|---|
| title | Estructura EntityManager Config |
|---|
| collapse | true |
|---|
|
@Singleton
@Startup
public class DaoEntityManagerConfig {
@PersistenceContext(unitName = "Diraya-Estructura-Persistence-Unit")
private EntityManager estructuraEntityManager;
@PostConstruct
public void init() {
EntityManagerContainer.setEntityManager(estructuraEntityManager);
}
} |
| UI Expand |
|---|
|
| Bloque de código |
|---|
| language | java |
|---|
| title | Estructura EntityManager Config |
|---|
| collapse | true |
|---|
| import es.ja.csalud.sas.componentescomunes.estructura.impl.jpa.control.config.EntityManagerContainer;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.context.Initialized;
import jakarta.enterprise.event.Observes;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
@ApplicationScoped
public class EntityManagerProducer {
@PersistenceContext(unitName = "Diraya-Estructura-Persistence-Unit")
private EntityManager estructuraEntityManager;
public void init(@Observes @Initialized(ApplicationScoped.class) Object pointless) {
EntityManagerContainer.setEntityManager(estructuraEntityManager);
}
} |
|
Generar configuración de la API: A partir de la versión 2.x de la librería, al funcionar en base a Futures, se hace necesario el uso de un Executor encargado de gestionar los hilos que se vayan lanzando en el sistema. Para ello bastará con añadir un Produces en nuestro proyecto como el siguiente:
| UI Expand |
|---|
|
| Bloque de código |
|---|
| language | java |
|---|
| title | Productor Estructura Api Config |
|---|
| collapse | true |
|---|
|
@Produces
@Singleton
public EstructuraApiConfig producerEstructuraApiConfig() {
return new EstructuraApiConfigBuilder().executorPoolSize(20).build();
} |
| UI Expand |
|---|
|
| Bloque de código |
|---|
| language | java |
|---|
| title | Productor Estructura Api Config |
|---|
| collapse | true |
|---|
| import es.ja.csalud.sas.componentescomunes.estructura.impl.jpa.control.config.EstructuraApiConfig;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.inject.Produces;
import jakarta.inject.Singleton;
import org.eclipse.microprofile.context.ManagedExecutor;
import org.eclipse.microprofile.context.ThreadContext;
@ApplicationScoped
public class EstructuraContext {
@Produces
@Singleton
public EstructuraApiConfig producerEstructuraApiConfig() {
ManagedExecutor executor = ManagedExecutor.builder()
.propagated(ThreadContext.CDI, ThreadContext.APPLICATION)
.maxAsync(20)
.maxQueued(20)
.build();
return new EstructuraApiConfig.EstructuraApiConfigBuilder().executor(executor).executorPoolSize(20).build();
}
} |
|
IMPORTANTE: Es especialmente importante ser consciente de la forma de funcionar de un Produces, ya que si en cada inyección se realiza una llamada al Produces se creará en cada llamada un Executor diferente, generando un problema de rendimiento en el servidor por acumulación de hilos. Por tanto, queda a responsabilidad del programador que hace uso de la librería el asegurar que sólo se genere un Executor para toda la librería o por servicio. En el presente ejemplo esto se ha conseguido haciendo uso de @Singleton, pero igualmente podría conseguirse mediante variables estáticas, etc.
6. Instrucciones de uso
Una vez configurado nuestro proyecto, el uso de la librería es tan simple como inyectar el servicio que deseemos utilizar (AreaConocimientoService, AreaHospitalariaService, etc) en cualquier parte de nuestro código para poder hacer uso de toda la funcionalidad que ofrece la librería.
A partir de la versión 2.0.0.1 de la librería se ha modificado el modo de uso de la librería de forma que todos los servicios existentes han sido evolucionados a servicios equivalentes que devuelven Futures en lugar de devolver directamente las entidades solicitadas. De esta forma el programador podrá paralelizar otras tareas mientras la librería obtiene el dato, cosa que hará que mejore el rendimiento considerablemente en el caso de que el dato tenga que ser obtenido por medio de servicios webs
En el siguiente fragmento de código puede verse un ejemplo sencillo en el que se ha diseñado un servicio llamado "EpisodioService" el cual hará tres acciones típicas de sistemas sanitarios: En primer lugar buscará en su propia base de datos un episodio a partir de un identificador dado, posteriormente usará la librería de Estructura (Marcado en rojo) para recuperar la información asociada de la cama en la que se encuentra ingresado el paciente. Tras esta llamada la librería devuelve un Future y el hilo de ejecución continua, por lo que podemos recuperar en paralelo las citas del paciente (Marcado en verde):
public class EpisodioService {
private EpisodioDao episodioDao;
private CitasService citasService;
private UbicacionService ubicacionService;
@Inject
public EpisodioService(EpisodioDao episodioDao, CitasService citasService, UbicacionService ubicacionService) {
this.episodioDao = episodioDao;
this.citasService = citasService;
this.ubicacionService = ubicacionService;
}
public EpisodioDTO getEpisodio(Long numEpisodio) {
EpisodioDTO result = null;
Context context = GeneradorContexto.createContext(...);
Episodio epiAux = episodioDao.getByPk(numEpisodio);
FutureTask<Ubicacion> ubicacionFuture = ubicacionService.getUbicacionByCodigo(context, TipoUbicacionEnum.CAMA, epiAux.getCodCama())
List<Citas> citas = citasService.getByEpisodio(numEpisodio);
if (epiAux != null) {
result = new EpisodioDTO();
result.setNumEpisodio(epiAux.getNumEpisodio());
result.setFchIngreso(epiAux.getFchIngreso());
result.setCama(ubicacionFuture.get());
}
return result;
}
}
Mención especial requiere el atributo "Context", marcado en azul en el ejemplo anterior. Este objeto tiene como objetivo ser un contenedor de información que representa el contexto en el que nos encontramos.
Actualmente, sólo consta de un objeto de tipo MacoUser, el cual podrá usarse el día de mañana para validar los usuarios en MACO. Por ello, el objetivo es tener un servicio encargado de generar los contextos que se pasarán a la API de Estructura (En este ejemplo, sería el objeto GeneradorContexto), de esta forma, al generarse siempre el contexto desde un punto común, cuando sea necesario realizar nuevas modificaciones, estas podrán realizarse en un único punto y aplicarán automáticamente a todo el código. Consulte JavaDoc para ver detalle del objeto. Este objeto debe ser pasado como parámetro en todas las llamadas a la librería, de esta forma la implementación de la API que se esté usando podrá hacer uso del contexto para validar el usuario.