Dirección General de Sistemas de Información y Comunicaciones

Áreas de Gobierno Tecnológico de SSII y del Dato


Contenido

 

Resumen
  • Versión: v01r17
  • Fecha publicación:  
  • Entrada en vigor desde:  

Cumplimiento normativo

Las normas expuestas son de obligado cumplimiento. La STIC podrá estudiar los casos excepcionales los cuales serán gestionados a través de los responsables del proyecto correspondiente y autorizados por el Área de Gobernanza de la STIC. Asimismo cualquier aspecto no recogido en estas normas deberá regirse en primera instancia por las guías técnicas correspondientes al esquema nacional de seguridad y esquema nacional de interoperabilidad según correspondencia y en su defecto a los marcos normativos y de desarrollo software establecidos por la Junta de Andalucía, debiendo ser puesto de manifiesto ante la STIC.

La STIC se reserva el derecho a la modificación de la norma sin previo aviso, tras lo cual, notificará del cambio a los actores implicados para su adopción inmediata según la planificación de cada proyecto.

En el caso de que algún actor considere conveniente y/o necesario el incumplimiento de alguna de las normas y/o recomendaciones, deberá aportar previamente la correspondiente justificación fehaciente documentada de la solución alternativa propuesta, así como toda aquella documentación que le sea requerida por la STIC para proceder a su validación técnica.

Contacto Arquitectura: l-arquitectura.stic@juntadeandalucia.es

Histórico de cambios

Los cambios en la normativa vendrán acompañados de un registro de las modificaciones. De este modo se podrá realizar un seguimiento y consultar su evolución. Ordenándose de mas recientes a menos recientes, prestando especial cuidado a las cabezeras de la tablas dónde se indican las fechas de entrada en vigor y versión.

Versiónv01r1Fecha publicación

 

Fecha entrada en vigor

 

Alcance
  • Versión inicial sobre el componente que permite la integración con Estructura fácilmente

1. Introducción 

En el presente documento se presenta la librería "estructuraApiClient", librería Java desarrollada por el SAS para facilitar el acceso a la información de la aplicación Estructura por terceras aplicaciones desarrolladas dentro de la organización.

Con esta librería los proveedores podrán abstraerse de los mecanismos de conexión existentes actualmente con la aplicación Estructura, facilitando considerablemente el acceso a la información de la misma y, lo que es más importante, conseguir desacoplar los aplicativos finales de Estructura, permitiendo que en un futuro Estructura pueda evolucionar sin impactar en el conjunto de aplicaciones que hacen uso de la misma.


Nota sobre el versionado dual (Ramas 2.x vs 3.x)

Para dar soporte a las diferentes plataformas tecnológicas del SAS, la librería mantiene dos líneas de desarrollo concurrentes. La rama  2.x  está diseñada para mantener la retrocompatibilidad con entornos  JDK 1.7 / Java EE. Por su parte, la rama  3.x  está adaptada a las nuevas arquitecturas basadas en  JDK 21 / Jakarta EE. Ambas ramas son funcionalmente equivalentes y evolucionan en paralelo en cuanto a contratos y servicios públicos se refiere, siendo la 3.0.0 equivalente a la base funcional de la 2.2.2, y nivelándose progresivamente en versiones posteriores.

2. Dependencias

EstructuraApiClient (JDK 1.7)MacoApiClientsas-utils
2.3.02.0.02.0.2
2.2.52.0.02.0.2
2.2.42.0.02.0.2
2.2.32.0.02.0.2
2.2.22.0.02.0.2
2.2.12.0.02.0.2
2.2.02.0.02.0.2
2.1.1.11.3.0.1
2.1.0.11.3.0.1
2.0.0.11.3.0.1
1.1.0.11.3.0.1
1.0.0.11.3.0.1


EstructuraApiClient (JDK 21)MacoApiClientsas-utilsNotas
3.1.03.0.12.0.2Equivalencia funcional con EstructuraApiClient v2.3.0 (JDK 1.7)
3.0.33.0.12.0.2Equivalencia funcional con EstructuraApiClient v2.2.5 (JDK 1.7)
3.0.23.0.12.0.2Equivalencia funcional con EstructuraApiClient v2.2.4 (JDK 1.7)
3.0.13.0.12.0.2Equivalencia funcional con EstructuraApiClient v2.2.3 (JDK 1.7)
3.0.03.0.12.0.2Equivalencia funcional con EstructuraApiClient v2.2.2 (JDK 1.7)


3. Historial de Cambios

  • 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:
    • BClaveMedica
    • BFacultativo
  • Ajustes y correcciones en Tests
  • 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);
  • Servicio modificado: UbicacionService
    • FutureTask<List<Ubicacion>> getUbicacionesByLastUpdate(Context context, Date lastUpdate);
  • 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);
  • 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
  • Core
    • Resolución de la incidencia OTARQ-754.
    • Actualización del mapper de `Localidad` para soportar campos nulos.
  • 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);
  • Actualización de las dependencias:
    • sas-utils:2.0.2
    • macoApiClient:2.0.0
  • Ajustes y fixes en los descriptores pom.xml.
  • Cambios de versión de dependencias subyacentes.
  • 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);
  • Arreglos menores
  • 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);
  • 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
      • FutureTask<AreaConocimiento> getAreaConocimientoByCodigo(Context context, String codigo);
      • FutureTask<List<AreaConocimiento>> getAreasConocimiento(Context context);
      • FutureTask<List<AreaConocimiento>> getAreasConocimientoByNombre(Context context, String nombre);
    • Area Hospitalaria
      • FutureTask<List<AreaHospitalaria>> getAreasHospitalarias(Context context, TipoGestionAreaHospitalariaEnum tipoGestion);
      • FutureTask<List<AreaHospitalaria>> getAreasHospitalariasByNombre(Context context, TipoGestionAreaHospitalariaEnum tipoGestion, String nombre);
      • FutureTask<AreaHospitalaria> getAreaHospitalariaByCodigo(Context context, TipoGestionAreaHospitalariaEnum tipoGestion, String codigo);
    • Centro Especializada
      • FutureTask<CentroEspecializada> getCentroEspecializadaByCodigo(Context context, String codigo);
      • FutureTask<List<CentroEspecializada>> getCentrosEspecializada(Context context);
      • FutureTask<List<CentroEspecializada>> getCentrosEspecializadaByArea(Context context, String codigoArea);
      • FutureTask<List<CentroEspecializada>> getCentrosEspecializadaByNombre(Context context, String nombre);
      • FutureTask<List<CentroEspecializada>> getCentrosEspecializadaByUnidadFuncional(Context context, String codigoUnidadFuncional);
    • Centro Primaria
      • FutureTask<CentroPrimaria> getCentroPrimariaByCodigo(Context context, String codigo);
      • FutureTask<List<CentroPrimaria>> getCentrosPrimariaByCodigoPostal(Context context, Long codigoPostal);
      • FutureTask<List<CentroPrimaria>> getCentrosPrimariaByDistrito(Context context, Long distrito);
      • FutureTask<List<CentroPrimaria>> getCentrosPrimariaByLocalidad(Context context, Long localidad);
      • FutureTask<List<CentroPrimaria>> getCentrosPrimariaByMunicipio(Context context, Long municipio);
      • FutureTask<List<CentroPrimaria>> getCentrosPrimariaByNombre(Context context, String nombre);
      • FutureTask<List<CentroPrimaria>> getCentrosPrimariaByZonaBasica(Context context, Long zonaBasica);
    • Comunidad Autonoma
      • FutureTask<ComunidadAutonoma> getComunidadAutonomaByCodigo(Context context, String codigo);
      • FutureTask<List<ComunidadAutonoma>> getComunidadesAutonomas(Context context);
      • FutureTask<List<ComunidadAutonoma>> getComunidadesAutonomasByNombre(Context context, String nombre);
    • Distrito
      • FutureTask<Distrito> getDistritoByCodigo(Context context, String codigo);
      • FutureTask<List<Distrito>> getDistritos(Context context);
      • FutureTask<List<Distrito>> getDistritosByMunicipio(Context context, String codigoMunicipio);
      • FutureTask<List<Distrito>> getDistritosByNombre(Context context, String nombre);
      • FutureTask<List<Distrito>> getDistritosByProvincia(Context context, String codigoProvincia);
    • Especialidad
      • FutureTask<Especialidad> getEspecialidadByCodigo(Context context, String codigo);
      • FutureTask<Especialidad> getEspecialidadByUnidadFuncional(Context context, String codigoUnidadFuncional);
      • FutureTask<List<Especialidad>> getEspecialidadByNombre(Context context, String nombre);
      • FutureTask<List<Especialidad>> getEspecialidades(Context context);
    • Provincia
      • FutureTask<Provincia> getProvinciaByCodigo(Context context, String codigo);
      • FutureTask<List<Provincia>> getProvincias(Context context);
      • FutureTask<List<Provincia>> getProvinciasByComunidadAutonoma(Context context, String codigoComunidadAutonoma);
      • FutureTask<List<Provincia>> getProvinciasByNombre(Context context, String nombre);
    • Tipo Asistencia
      • FutureTask<TipoAsistencia> getTipoAsistenciaByCodigo(Context context, String codigo);
      • FutureTask<List<TipoAsistencia>> getTiposAsistencia(Context context);
      • FutureTask<List<TipoAsistencia>> getTiposAsistenciasByCentroAP(Context context, String codigoCentroAP);
      • FutureTask<List<TipoAsistencia>> getTiposAsistenciasByNombre(Context context, String nombre);
    • Tipo Profesional
      • FutureTask<TipoProfesional> getTipoProfesionalByCodigo(Context context, String codigo);
      • FutureTask<List<TipoProfesional>> getTiposProfesionales(Context context);
      • FutureTask<List<TipoProfesional>> getTiposProfesionalesByNombre(Context context, String nombre);
    • Ubicacion
      • FutureTask<Ubicacion> getUbicacionByCodigo(Context context, TipoUbicacionEnum tipo, String codigo);
      • FutureTask<List<Ubicacion>> getUbicaciones(Context context, TipoUbicacionEnum tipo);
      • FutureTask<List<Ubicacion>> getUbicacionesByArea(Context context, TipoUbicacionEnum tipo, String codigoAreaHospitalaria);
      • FutureTask<List<Ubicacion>> getUbicacionesByCentro(Context context, TipoUbicacionEnum tipo, Long codigoCentro);
      • FutureTask<List<Ubicacion>> getUbicacionesByNombre(Context context, TipoUbicacionEnum tipo, String nombre);
      • FutureTask<List<Ubicacion>> getUbicacionesByPadre(Context context, TipoUbicacionEnum tipo, String codigoPadre);
    • Unidad Funcional Especializada
      • FutureTask<UnidadFuncionalEspecializada> getUnidadFuncionalByCodigo(Context context, String codigo);
      • FutureTask<List<UnidadFuncionalEspecializada>> getUnidadesFuncionales(Context context);
      • FutureTask<List<UnidadFuncionalEspecializada>> getUnidadesFuncionalesByArea(Context context, String codigoAreaHospitalaria);
      • FutureTask<List<UnidadFuncionalEspecializada>> getUnidadesFuncionalesByCentro(Context context, String codigoCentro);
      • FutureTask<List<UnidadFuncionalEspecializada>> getUnidadesFuncionalesByNombre(Context context, String nombre);
    • Unidad Funcional Primaria
      • FutureTask<UnidadFuncionalPrimaria> getUnidadFuncionalByCodigo(Context context, String codigo);
      • FutureTask<List<UnidadFuncionalPrimaria>> getUnidadesFuncionales(Context context);
      • FutureTask<List<UnidadFuncionalPrimaria>> getUnidadesFuncionalesByCentroAPActividad(Context context, String codigoCentroAP);
      • FutureTask<List<UnidadFuncionalPrimaria>> getUnidadesFuncionalesByCentroAPSede(Context context, String codigoCentroAP);
      • FutureTask<List<UnidadFuncionalPrimaria>> getUnidadesFuncionalesByNombre(Context context, String nombre);
  • 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(Context context, String codigo);
    • List<CentroEspecializada> getCentrosEspecializada(Context context);
    • List<CentroEspecializada> getCentrosEspecializadaByArea(Context context, String codigoArea);
    • List<CentroEspecializada> getCentrosEspecializadaByNombre(Context context, String nombre);
    • List<CentroEspecializada> getCentrosEspecializadaByUnidadFuncional(Context context, String codigoUnidadFuncional);
    • Especialidad getEspecialidadByCodigo(Context context, String codigo);
    • Especialidad getEspecialidadByUnidadFuncional(Context context, String codigoUnidadFuncional);
    • List<Especialidad> getEspecialidadByNombre(Context context, String nombre);
    • List<Especialidad> getEspecialidades(Context context);
    • Ubicacion getUbicacionByCodigo(Context context, TipoUbicacionEnum tipo, String codigo);
    • List<Ubicacion> getUbicaciones(Context context, TipoUbicacionEnum tipo);
    • List<Ubicacion> getUbicacionesByArea(Context context, TipoUbicacionEnum tipo, String codigoAreaHospitalaria);
    • List<Ubicacion> getUbicacionesByCentro(Context context, TipoUbicacionEnum tipo, Long codigoCentro);
    • List<Ubicacion> getUbicacionesByNombre(Context context, TipoUbicacionEnum tipo, String nombre);
    • List<Ubicacion> getUbicacionesByPadre(Context context, TipoUbicacionEnum tipo, String codigoPadre);
    • UnidadFuncionalEspecializada getUnidadFuncionalByCodigo(Context context, String codigo);
    • List<UnidadFuncionalEspecializada> getUnidadesFuncionales(Context context);
    • List<UnidadFuncionalEspecializada> getUnidadesFuncionalesByArea(Context context, String codigoAreaHospitalaria);
    • List<UnidadFuncionalEspecializada> getUnidadesFuncionalesByCentro(Context context, String codigoCentro);
    • List<UnidadFuncionalEspecializada> getUnidadesFuncionalesByNombre(Context context, String nombre);
  • Atención Primaria
    • AreaConocimiento getAreaConocimientoByCodigo(Context context, String codigo);
    • List<AreaConocimiento> getAreasConocimiento(Context context);
    • List<AreaConocimiento> getAreasConocimientoByNombre(Context context, String nombre);
    • CentroPrimaria getCentroPrimariaByCodigo(Context context, String codigo);
    • List<CentroPrimaria> getCentrosPrimariaByCodigoPostal(Context context, Long codigoPostal);
    • List<CentroPrimaria> getCentrosPrimariaByDistrito(Context context, Long distrito);
    • List<CentroPrimaria> getCentrosPrimariaByLocalidad(Context context, Long localidad);
    • List<CentroPrimaria> getCentrosPrimariaByMunicipio(Context context, Long municipio);
    • List<CentroPrimaria> getCentrosPrimariaByNombre(Context context, String nombre);
    • List<CentroPrimaria> getCentrosPrimariaByZonaBasica(Context context, Long zonaBasica);
    • Distrito getDistritoByCodigo(Context context, String codigo);
    • List<Distrito> getDistritos(Context context);
    • List<Distrito> getDistritosByMunicipio(Context context, String codigoMunicipio);
    • List<Distrito> getDistritosByNombre(Context context, String nombre);
    • List<Distrito> getDistritosByProvincia(Context context, String codigoProvincia);
    • TipoAsistencia getTipoAsistenciaByCodigo(Context context, String codigo);
    • List<TipoAsistencia> getTiposAsistencia(Context context);
    • List<TipoAsistencia> getTiposAsistenciasByCentroAP(Context context, String codigoCentroAP);
    • List<TipoAsistencia> getTiposAsistenciasByNombre(Context context, String nombre);
    • TipoProfesional getTipoProfesionalByCodigo(Context context, String codigo);
    • List<TipoProfesional> getTiposProfesionales(Context context);
    • List<TipoProfesional> getTiposProfesionalesByNombre(Context context, String nombre);
    • UnidadFuncionalPrimaria getUnidadFuncionalByCodigo(Context context, String codigo);
    • List<UnidadFuncionalPrimaria> getUnidadesFuncionales(Context context);
    • List<UnidadFuncionalPrimaria> getUnidadesFuncionalesByCentroAPActividad(Context context, String codigoCentroAP);
    • List<UnidadFuncionalPrimaria> getUnidadesFuncionalesByCentroAPSede(Context context, String codigoCentroAP);
    • List<UnidadFuncionalPrimaria> getUnidadesFuncionalesByNombre(Context context, String nombre);
  • Geolocalizacion
    • ComunidadAutonoma getComunidadAutonomaByCodigo(Context context, String codigo);
    • List<ComunidadAutonoma> getComunidadesAutonomas(Context context);
    • List<ComunidadAutonoma> getComunidadesAutonomasByNombre(Context context, String nombre);
    • Provincia getProvinciaByCodigo(Context context, String codigo);
    • List<Provincia> getProvincias(Context context);
    • List<Provincia> getProvinciasByComunidadAutonoma(Context context, String codigoComunidadAutonoma);
    • List<Provincia> getProvinciasByNombre(Context context, String nombre);
  • EstructuraEspecializadaService
    • AREAS_HOSPITALARIAS
      • AreaHospitalaria getAreaHospitalariaByCodigo(Context context, TipoGestionAreaHospitalariaEnum tipoGestion, String codigo);
      • List<AreaHospitalaria> getAreasHospitalarias(Context context, TipoGestionAreaHospitalariaEnum tipoGestion);
      • List<AreaHospitalaria> getAreasHospitalariasByNombre(Context context, TipoGestionAreaHospitalariaEnum tipoGestion, String nombre);
    • CENTROS_AH
      • CentroEspecializada getCentroEspecializadaByCodigo(Context context, String codigo);
      • List<CentroEspecializada> getCentrosEspecializadaByArea(Context context, String codigoArea);
      • List<CentroEspecializada> getCentrosEspecializada(Context context);
      • List<CentroEspecializada> getCentrosEspecializadaByNombre(Context context, String nombre);
      • List<CentroEspecializada> getCentrosEspecializadaByUnidadFuncional(Context context, String codigoUnidadFuncional);
    • ESPECIALIDADES
      • Especialidad getEspecialidadByCodigo(Context context, String codigo);
      • List<Especialidad> getEspecialidades(Context context);
      • List<Especialidad> getEspecialidadByNombre(Context context, String nombre);
      • Especialidad getEspecialidadByUnidadFuncional(Context context, String codigoUnidadFuncional);
    • UNIDADES_FUNCIONALES
      • List<UnidadFuncionalEspecializada> getUnidadesFuncionales(Context context);
      • UnidadFuncionalEspecializada getUnidadFuncionalByCodigo(Context context, String codigo);
      • List<UnidadFuncionalEspecializada> getUnidadesFuncionalesByNombre(Context context, String nombre);
      • List<UnidadFuncionalEspecializada> getUnidadesFuncionalesByCentro(Context context, String codigoCentro);
      • List<UnidadFuncionalEspecializada> getUnidadesFuncionalesByArea(Context context, String codigoAreaHospitalaria);
    • UBICACIONES
      • Ubicacion getUbicacionByCodigo(Context context, TipoUbicacionEnum tipo, String codigo);
      • List<Ubicacion> getUbicaciones(Context context, TipoUbicacionEnum tipo);
      • List<Ubicacion> getUbicacionesByNombre(Context context, TipoUbicacionEnum tipo, String nombre);
      • List<Ubicacion> getUbicacionesByArea(Context context, TipoUbicacionEnum tipo, String codigoAreaHospitalaria);
      • List<Ubicacion> getUbicacionesByCentro(Context context, TipoUbicacionEnum tipo, Long codigoCentro);
      • List<Ubicacion> getUbicacionesByPadre(Context context, TipoUbicacionEnum tipo, String codigoPadre);
  • EstructuraPrimariaService
    • CENTROS_AP
      • CentroPrimaria getCentroPrimariaByCodigo(Context context, String codigo);
      • List<CentroPrimaria> getCentrosPrimariaByNombre(Context context, String nombre);
      • List<CentroPrimaria> getCentrosPrimariaByZonaBasica(Context context, Long zonaBasica);
      • List<CentroPrimaria> getCentrosPrimariaByCodigoPostal(Context context, Long codigoPostal);
      • List<CentroPrimaria> getCentrosPrimariaByMunicipio(Context context, Long municipio);
      • List<CentroPrimaria> getCentrosPrimariaByLocalidad(Context context, Long localidad);


4. Servicios ofrecidos


Área Conocimiento (AreaConocimientoService)
MétodoDescripción
FutureTask<AreaConocimiento> getAreaConocimientoByCodigo(Context context, String codigo);Obtiene un área de conocimiento por su código identificador único.
FutureTask<List<AreaConocimiento>> getAreasConocimiento(Context context);Obtiene el catálogo completo de áreas de conocimiento disponibles.
FutureTask<List<AreaConocimiento>> getAreasConocimientoByNombre(Context context, String nombre);Busca áreas de conocimiento cuyo nombre coincida parcial o totalmente con el texto indicado.
Área Hospitalaria (AreaHospitalariaService)
MétodoDescripción
FutureTask<AreaHospitalaria> getAreaHospitalariaByCodigo(Context context, TipoGestionAreaHospitalariaEnum tipoGestion, String codigo);Obtiene un área hospitalaria por su código identificador único y tipo de gestión.
FutureTask<List<AreaHospitalaria>> getAreasHospitalarias(Context context, TipoGestionAreaHospitalariaEnum tipoGestion);Obtiene el catálogo de áreas hospitalarias según el tipo de gestión especificado.
FutureTask<List<AreaHospitalaria>> getAreasHospitalariasByNombre(Context context, TipoGestionAreaHospitalariaEnum tipoGestion, String nombre);Busca áreas hospitalarias cuyo nombre coincida parcial o totalmente con el texto indicado, filtrando por tipo de gestión.
Centro de Especializada (CentroEspecializadaService)
MétodoDescripción
FutureTask<CentroEspecializada> getCentroEspecializadaByCodigo(Context context, String codigo);Obtiene un centro de atención especializada por su código identificador único.
FutureTask<List<CentroEspecializada>> getCentrosEspecializada(Context context);Obtiene el catálogo completo de centros de atención especializada.
FutureTask<List<CentroEspecializada>> getCentrosEspecializadaByArea(Context context, String codigoArea);Obtiene los centros de atención especializada pertenecientes a un área hospitalaria específica.
FutureTask<List<CentroEspecializada>> getCentrosEspecializadaByNombre(Context context, String nombre);Busca centros de atención especializada cuyo nombre coincida parcial o totalmente con el texto indicado.
FutureTask<List<CentroEspecializada>> getCentrosEspecializadaByUnidadFuncional(Context context, String codigoUnidadFuncional);Obtiene los centros de atención especializada que tienen vinculada una unidad funcional específica.
Centro de Primaria (CentroPrimariaService)
MétodoDescripción
FutureTask<CentroPrimaria> getCentroPrimariaByCodigo(Context context, String codigo);Obtiene un centro de atención primaria por su código identificador único.
FutureTask<List<CentroPrimaria>> getCentrosPrimariaByNombre(Context context, String nombre);Busca centros de atención primaria cuyo nombre coincida parcial o totalmente con el texto indicado.
FutureTask<List<CentroPrimaria>> getCentrosPrimariaByZonaBasica(Context context, Long zonaBasica);Obtiene los centros de atención primaria asignados a una zona básica de salud específica.
FutureTask<List<CentroPrimaria>> getCentrosPrimariaByCodigoPostal(Context context, Long codigoPostal);Obtiene los centros de atención primaria ubicados en un código postal determinado.
FutureTask<List<CentroPrimaria>> getCentrosPrimariaByMunicipio(Context context, Long municipio);Obtiene los centros de atención primaria ubicados en un municipio específico.
FutureTask<List<CentroPrimaria>> getCentrosPrimariaByLocalidad(Context context, Long localidad);Obtiene los centros de atención primaria ubicados en una localidad determinada.
FutureTask<List<CentroPrimaria>> getCentrosPrimariaByDistrito(Context context, Long distrito);Obtiene los centros de atención primaria asignados a un distrito sanitario específico.
Centro Privado de Especializada (CentroPrivadoEspecializadaService)
MétodoDescripción
FutureTask<CentroPrivadoEspecializada> getCentroPrivadoByCodigo(Context context, Long codigo);Obtiene un centro privado de atención especializada por su código identificador único.
FutureTask<CentroPrivadoEspecializada> getCentroPrivadoByAhCodigo(Context context, String codigoAreaHospitalaria);Obtiene un centro privado de atención especializada asociado a un área hospitalaria específica.
FutureTask<CentroPrivadoEspecializada> getCentrosPrivadosByNombre(Context context, String nombre);Busca centros privados de atención especializada cuyo nombre coincida parcial o totalmente con el texto indicado.
FutureTask<List<CentroPrivadoEspecializada>> getCentrosPrivadosByProvincia(Context context, Long provincia);Obtiene el catálogo de centros privados de atención especializada ubicados en una provincia específica.
Código Postal (CodigoPostalService)
MétodoDescripción
FutureTask<List<CodigoPostal>> getCodigoPostalByLocalidad(Context context, String codigoLocalidad);Obtiene los códigos postales asociados a una localidad específica.
FutureTask<List<CodigoPostal>> getCodigoPostalByCode(Context context, String code);Busca códigos postales que coincidan con el valor numérico indicado.
FutureTask<List<CodigoPostal>> getCodigoPostalByMunicipioPostalCode(Context context, String municipioPostaCode);Obtiene los códigos postales asociados a un municipio específico.
FutureTask<List<CodigoPostal>> searchCodigoPostalByCriteria(Context context, T criteria);Realiza una búsqueda flexible de códigos postales aplicando los criterios especificados.
Comunidad Autónoma (ComunidadAutonomaService)
MétodoDescripción
FutureTask<ComunidadAutonoma> getComunidadAutonomaByCodigo(Context context, String codigo);Obtiene una comunidad autónoma por su código identificador único.
FutureTask<List<ComunidadAutonoma>> getComunidadesAutonomas(Context context);Obtiene el catálogo completo de comunidades autónomas disponibles.
FutureTask<List<ComunidadAutonoma>> getComunidadesAutonomasByNombre(Context context, String nombre);Busca comunidades autónomas cuyo nombre coincida parcial o totalmente con el texto indicado.
Dirección (DireccionService)
MétodoDescripción
FutureTask<Address> getDireccionByCodigo(Context context, String codigo);Obtiene una dirección por su código identificador único.
FutureTask<List<Address>> getDireccionByCodigoPostal(Context context, String codigoPostal);Obtiene las direcciones registradas bajo un código postal específico.
FutureTask<List<Address>> getDireccionByProvincia(Context context, Long provincia);Obtiene las direcciones ubicadas en una provincia determinada.
FutureTask<List<Address>> getDireccionByMunicipio(Context context, Long municipio);Obtiene las direcciones ubicadas en un municipio específico.
Dispositivo de Apoyo (DispositivoApoyoService)
MétodoDescripción
FutureTask<DispositivoApoyo> getDispositivoApoyoByCodigo(Context context, String codigo);Obtiene un dispositivo de apoyo por su código identificador único.
FutureTask<List<DispositivoApoyo>> getDispositivosApoyo(Context context);Obtiene el catálogo completo de dispositivos de apoyo disponibles.
FutureTask<List<DispositivoApoyo>> getDispositivosApoyoByNombre(Context context, String nombre);Busca dispositivos de apoyo cuyo nombre coincida parcial o totalmente con el texto indicado.
FutureTask<List<DispositivoApoyo>> getDispositivosApoyoByCentroAPSede(Context context, String codigoCentroAP);Obtiene los dispositivos de apoyo físicamente ubicados en la sede de un centro de atención primaria.
FutureTask<List<DispositivoApoyo>> getDispositivosApoyoByCentroAPActividad(Context context, String codigoCentroAP);Obtiene los dispositivos de apoyo asociados a la actividad clínica de un centro de atención primaria.
FutureTask<List<DispositivoApoyo>> getDispositivosApoyoByDistrito(Context context, String codigoDistrito);Obtiene los dispositivos de apoyo asignados a un distrito sanitario específico.
FutureTask<List<DispositivoApoyo>> getDispositivosApoyoPasivosByDistrito(Context context, String codigoDistrito);Obtiene los dispositivos de apoyo en estado inactivo/pasivo pertenecientes a un distrito sanitario.
Distrito (DistritoService)
MétodoDescripción
FutureTask<Distrito> getDistritoByCodigo(Context context, String codigo);Obtiene un distrito sanitario por su código identificador único.
FutureTask<List<Distrito>> getDistritos(Context context);Obtiene el catálogo completo de distritos sanitarios disponibles.
FutureTask<List<Distrito>> getDistritosByNombre(Context context, String nombre);Busca distritos sanitarios cuyo nombre coincida parcial o totalmente con el texto indicado.
FutureTask<List<Distrito>> getDistritosByProvincia(Context context, String codigoProvincia);Obtiene los distritos sanitarios ubicados en una provincia específica.
FutureTask<List<Distrito>> getDistritosByMunicipio(Context context, String codigoMunicipio);Obtiene los distritos sanitarios asignados a un municipio específico.
Especialidad (EspecialidadService)
MétodoDescripción
FutureTask<Especialidad> getEspecialidadByCodigo(Context context, String codigo);Obtiene una especialidad sanitaria por su código identificador único.
FutureTask<List<Especialidad>> getEspecialidades(Context context);Obtiene el catálogo completo de especialidades sanitarias disponibles.
FutureTask<List<Especialidad>> getEspecialidadByNombre(Context context, String nombre);Busca especialidades sanitarias cuyo nombre coincida parcial o totalmente con el texto indicado.
FutureTask<Especialidad> getEspecialidadByUnidadFuncional(Context context, String codigoUnidadFuncional);Obtiene la especialidad vinculada a una unidad funcional específica.
Estructura Especializada (EstructuraEspecializadaService) ⚠️ (Deprecado)
MétodoDescripción
AreaHospitalaria getAreaHospitalariaByCodigo(Context context, TipoGestionAreaHospitalariaEnum tipoGestion, String codigo);[DEPRECADO]  Recupera la entidad Estructura filtrando exactamente por su código identificador.
List<AreaHospitalaria> getAreasHospitalarias(Context context, TipoGestionAreaHospitalariaEnum tipoGestion);[DEPRECADO]  Recupera la totalidad del catálogo de Área Hospitalarias sin aplicar filtros de restricción (volcado completo).
List<AreaHospitalaria> getAreasHospitalariasByNombre(Context context, TipoGestionAreaHospitalariaEnum tipoGestion, String nombre);[DEPRECADO]  Recupera el catálogo de Área Hospitalarias filtrando por coincidencias en su nombre.
CentroEspecializada getCentroEspecializadaByCodigo(Context context, String codigo);[DEPRECADO]  Recupera la entidad Estructura filtrando exactamente por su código identificador.
List<CentroEspecializada> getCentrosEspecializada(Context context);[DEPRECADO]  Recupera la totalidad del catálogo de Centros de Atención Especializada sin aplicar filtros de restricción (volcado completo).
List<CentroEspecializada> getCentrosEspecializadaByArea(Context context, String codigoArea);[DEPRECADO]  Recupera el catálogo de Centros de Atención Especializada asociadas al código de Área Hospitalaria proporcionado.
List<CentroEspecializada> getCentrosEspecializadaByNombre(Context context, String nombre);[DEPRECADO]  Recupera el catálogo de Centros de Atención Especializada filtrando por coincidencias en su nombre.
List<CentroEspecializada> getCentrosEspecializadaByUnidadFuncional(Context context, String codigoUnidadFuncional);[DEPRECADO]  Recupera el catálogo de Centros de Atención Especializada que tienen actividad o vinculación con el código de Unidad Funcional indicado.
UnidadFuncionalEspecializada getUnidadFuncionalByCodigo(Context context, String codigo);[DEPRECADO]  Recupera la entidad Estructura filtrando exactamente por su código identificador.
List<UnidadFuncionalEspecializada> getUnidadesFuncionales(Context context);[DEPRECADO]  Recupera la totalidad del catálogo de Unidad Funcional Especializadas sin aplicar filtros de restricción (volcado completo).
List<UnidadFuncionalEspecializada> getUnidadesFuncionalesByNombre(Context context, String nombre);[DEPRECADO]  Recupera el catálogo de Unidad Funcional Especializadas filtrando por coincidencias en su nombre.
List<UnidadFuncionalEspecializada> getUnidadesFuncionalesByCentro(Context context, String codigoCentro);[DEPRECADO]  Recupera el catálogo de Unidad Funcional Especializadas vinculadas a un código de Centro específico.
List<UnidadFuncionalEspecializada> getUnidadesFuncionalesByArea(Context context, String codigoAreaHospitalaria);[DEPRECADO]  Recupera el catálogo de Unidad Funcional Especializadas asociadas al código de Área Hospitalaria proporcionado.
Especialidad getEspecialidadByCodigo(Context context, String codigo);[DEPRECADO]  Recupera la entidad Estructura filtrando exactamente por su código identificador.
List<Especialidad> getEspecialidades(Context context);[DEPRECADO]  Recupera la totalidad del catálogo de Especialidades sin aplicar filtros de restricción (volcado completo).
List<Especialidad> getEspecialidadByNombre(Context context, String nombre);[DEPRECADO]  Recupera el catálogo de Especialidades filtrando por coincidencias en su nombre.
Especialidad getEspecialidadByUnidadFuncional(Context context, String codigoUnidadFuncional);[DEPRECADO]  Recupera la entidad Estructura que tienen actividad o vinculación con el código de Unidad Funcional indicado.
Ubicacion getUbicacionByCodigo(Context context, TipoUbicacionEnum tipo, String codigo);[DEPRECADO]  Recupera la entidad Estructura filtrando exactamente por su código identificador.
List<Ubicacion> getUbicaciones(Context context, TipoUbicacionEnum tipo);[DEPRECADO]  Recupera la totalidad del catálogo de Ubicaciónes sin aplicar filtros de restricción (volcado completo).
List<Ubicacion> getUbicacionesByNombre(Context context, TipoUbicacionEnum tipo, String nombre);[DEPRECADO]  Recupera el catálogo de Ubicaciónes filtrando por coincidencias en su nombre.
List<Ubicacion> getUbicacionesByArea(Context context, TipoUbicacionEnum tipo, String codigoAreaHospitalaria);[DEPRECADO]  Recupera el catálogo de Ubicaciónes asociadas al código de Área Hospitalaria proporcionado.
List<Ubicacion> getUbicacionesByCentro(Context context, TipoUbicacionEnum tipo, Long codigoCentro);[DEPRECADO]  Recupera el catálogo de Ubicaciónes vinculadas a un código de Centro específico.
List<Ubicacion> getUbicacionesByPadre(Context context, TipoUbicacionEnum tipo, String codigoPadre);[DEPRECADO]  Recupera el catálogo de Ubicaciónes dependientes del código de la entidad padre proporcionada.
Estructura Geográfica (EstructuraGeoService) ⚠️ (Deprecado)
MétodoDescripción
ComunidadAutonoma getComunidadAutonomaByCodigo(Context context, String codigo);[DEPRECADO]  Recupera la entidad Estructura filtrando exactamente por su código identificador.
List<ComunidadAutonoma> getComunidadesAutonomas(Context context);[DEPRECADO]  Recupera la totalidad del catálogo de Estructuras sin aplicar filtros de restricción (volcado completo).
List<ComunidadAutonoma> getComunidadesAutonomasByNombre(Context context, String nombre);[DEPRECADO]  Recupera el catálogo de Estructuras filtrando por coincidencias en su nombre.
Provincia getProvinciaByCodigo(Context context, String codigo);[DEPRECADO]  Recupera la entidad Estructura filtrando exactamente por su código identificador.
List<Provincia> getProvincias(Context context);[DEPRECADO]  Recupera la totalidad del catálogo de Estructuras sin aplicar filtros de restricción (volcado completo).
List<Provincia> getProvinciasByNombre(Context context, String nombre);[DEPRECADO]  Recupera el catálogo de Estructuras filtrando por coincidencias en su nombre.
List<Provincia> getProvinciasByComunidadAutonoma(Context context, String codigoComunidadAutonoma);[DEPRECADO]  Recupera el catálogo de Estructuras pertenecientes al código de Comunidad Autónoma proporcionado.
Estructura Primaria (EstructuraPrimariaService) ⚠️ (Deprecado)
MétodoDescripción
CentroPrimaria getCentroPrimariaByCodigo(Context context, String codigo);[DEPRECADO]  Recupera la entidad Estructura filtrando exactamente por su código identificador.
List<CentroPrimaria> getCentrosPrimariaByNombre(Context context, String nombre);[DEPRECADO]  Recupera el catálogo de Centros de Atención Primaria filtrando por coincidencias en su nombre.
List<CentroPrimaria> getCentrosPrimariaByZonaBasica(Context context, Long zonaBasica);[DEPRECADO]  Recupera el catálogo de Centros de Atención Primaria asociadas a una Zona Básica de Salud determinada por su código.
List<CentroPrimaria> getCentrosPrimariaByCodigoPostal(Context context, Long codigoPostal);[DEPRECADO]  Recupera el catálogo de Centros de Atención Primaria ubicadas en el Código Postal indicado.
List<CentroPrimaria> getCentrosPrimariaByMunicipio(Context context, Long municipio);[DEPRECADO]  Recupera el catálogo de Centros de Atención Primaria pertenecientes al código de Municipio proporcionado.
List<CentroPrimaria> getCentrosPrimariaByLocalidad(Context context, Long localidad);[DEPRECADO]  Recupera el catálogo de Centros de Atención Primaria ubicadas en el código de Localidad indicado.
List<CentroPrimaria> getCentrosPrimariaByDistrito(Context context, Long distrito);[DEPRECADO]  Recupera el catálogo de Centros de Atención Primaria asociadas al código de Distrito sanitario proporcionado.
TipoProfesional getTipoProfesionalByCodigo(Context context, String codigo);[DEPRECADO]  Recupera la entidad Estructura filtrando exactamente por su código identificador.
List<TipoProfesional> getTiposProfesionales(Context context);[DEPRECADO]  Recupera la totalidad del catálogo de Tipos de Profesional sin aplicar filtros de restricción (volcado completo).
List<TipoProfesional> getTiposProfesionalesByNombre(Context context, String nombre);[DEPRECADO]  Recupera el catálogo de Tipos de Profesional filtrando por coincidencias en su nombre.
AreaConocimiento getAreaConocimientoByCodigo(Context context, String codigo);[DEPRECADO]  Recupera la entidad Estructura filtrando exactamente por su código identificador.
List<AreaConocimiento> getAreasConocimiento(Context context);[DEPRECADO]  Recupera la totalidad del catálogo de Áreas de Conocimiento sin aplicar filtros de restricción (volcado completo).
List<AreaConocimiento> getAreasConocimientoByNombre(Context context, String nombre);[DEPRECADO]  Recupera el catálogo de Áreas de Conocimiento filtrando por coincidencias en su nombre.
Distrito getDistritoByCodigo(Context context, String codigo);[DEPRECADO]  Recupera la entidad Estructura filtrando exactamente por su código identificador.
List<Distrito> getDistritos(Context context);[DEPRECADO]  Recupera la totalidad del catálogo de Distritos sin aplicar filtros de restricción (volcado completo).
List<Distrito> getDistritosByNombre(Context context, String nombre);[DEPRECADO]  Recupera el catálogo de Distritos filtrando por coincidencias en su nombre.
List<Distrito> getDistritosByProvincia(Context context, String codigoProvincia);[DEPRECADO]  Recupera el catálogo de Distritos ubicadas en el código de Provincia indicado.
List<Distrito> getDistritosByMunicipio(Context context, String codigoMunicipio);[DEPRECADO]  Recupera el catálogo de Distritos pertenecientes al código de Municipio proporcionado.
TipoAsistencia getTipoAsistenciaByCodigo(Context context, String codigo);[DEPRECADO]  Recupera la entidad Estructura filtrando exactamente por su código identificador.
List<TipoAsistencia> getTiposAsistencia(Context context);[DEPRECADO]  Recupera la totalidad del catálogo de Tipos de Asistencia sin aplicar filtros de restricción (volcado completo).
List<TipoAsistencia> getTiposAsistenciasByNombre(Context context, String nombre);[DEPRECADO]  Recupera el catálogo de Tipos de Asistencia filtrando por coincidencias en su nombre.
List<TipoAsistencia> getTiposAsistenciasByCentroAP(Context context, String codigoCentroAP);[DEPRECADO]  Recupera el catálogo de Tipos de Asistencia vinculadas a un código de Centro de Atención Primaria.
UnidadFuncionalPrimaria getUnidadFuncionalByCodigo(Context context, String codigo);[DEPRECADO]  Recupera la entidad Estructura filtrando exactamente por su código identificador.
List<UnidadFuncionalPrimaria> getUnidadesFuncionales(Context context);[DEPRECADO]  Recupera la totalidad del catálogo de Unidades Funcionales de Primaria sin aplicar filtros de restricción (volcado completo).
List<UnidadFuncionalPrimaria> getUnidadesFuncionalesByNombre(Context context, String nombre);[DEPRECADO]  Recupera el catálogo de Unidades Funcionales de Primaria filtrando por coincidencias en su nombre.
List<UnidadFuncionalPrimaria> getUnidadesFuncionalesByCentroAPSede(Context context, String codigoCentroAP);[DEPRECADO]  Recupera el catálogo de Unidades Funcionales de Primaria vinculadas físicamente a la sede de un código de Centro de Atención Primaria.
List<UnidadFuncionalPrimaria> getUnidadesFuncionalesByCentroAPActividad(Context context, String codigoCentroAP);[DEPRECADO]  Recupera el catálogo de Unidades Funcionales de Primaria asociadas a la actividad clínica de un código de Centro de Atención Primaria.
Localidad (LocalidadService)
MétodoDescripción
FutureTask<Localidad> getLocalidadByCodigo(Context ctx, String codigoLocalidad);Obtiene una localidad por su código identificador único.
FutureTask<List<Localidad>> getLocalidades(Context ctx);Obtiene el catálogo completo de localidades disponibles.
FutureTask<List<Localidad>> getLocalidadesByNombre(Context ctx,String nameFilter);Busca localidades cuyo nombre coincida parcial o totalmente con el texto indicado.
FutureTask<List<Localidad>> getLocalidadesByMunicipio(Context ctx,String codigoMun);Obtiene las localidades pertenecientes a un municipio específico.
FutureTask<List<Localidad>> getLocalidadesByProvincia(Context ctx,String codigoProv);Obtiene las localidades ubicadas en una provincia específica.
FutureTask<List<Localidad>> getLocalidadesByEntidadSingular(Context ctx,String codigo);Obtiene las localidades asociadas a una entidad singular del INE.
FutureTask<List<Localidad>> getLocalidadesByEntidadColectiva(Context ctx,String codigo);Obtiene las localidades asociadas a una entidad colectiva del INE.
FutureTask<List<Localidad>> getLocalidadesByNucleo(Context ctx,String codigo);Obtiene las localidades asociadas a un núcleo poblacional del INE.
FutureTask<List<Localidad>> getLocalidadesByStatus(Context ctx,Boolean pasivo);Obtiene las localidades filtrando por su estado de vigencia (activo/pasivo).
FutureTask<List<Localidad>> searchLocalidadesByCriteria(Context ctx,T criteria);Realiza una búsqueda flexible de localidades aplicando los criterios especificados.
FutureTask<List<Localidad>> searchLocalidadesByCriteria(Context ctx,T criteria,Integer page,Integer sizePerPage);Realiza una búsqueda paginada de localidades aplicando los criterios especificados.
Municipio (MunicipioService)
MétodoDescripción
FutureTask<Municipio> getMunicipioByCodigo(Context c, String codigo);Obtiene un municipio por su código identificador único.
FutureTask<List<Municipio>> getMunicipiosByProvincia(Context c, String codigo);Obtiene los municipios pertenecientes a una provincia específica.
FutureTask<List<Municipio>> getMunicipiosByNombre(Context c, String searchString);Busca municipios cuyo nombre coincida parcial o totalmente con el texto indicado.
FutureTask<List<Municipio>> getMunicipiosByStatus(Context c, Boolean pasivo);Obtiene los municipios filtrando por su estado de vigencia (activo/pasivo).
FutureTask<List<Municipio>> searchMunicipiosByCriteria(Context c, C criteria);Realiza una búsqueda flexible de municipios aplicando los criterios especificados.
FutureTask<Municipio> getMunicipioByCentroAtencionPrimaria(Context c, String codigoCentroAP);Obtiene el municipio donde está ubicado un centro de atención primaria.
FutureTask<Municipio> getMunicipioByCodigoDispositivoApoyo(Context c, String codigoDispositivoApoyo);Obtiene el municipio donde está ubicado un dispositivo de apoyo.
Nacionalidad (NacionalidadService)
MétodoDescripción
FutureTask<Nacionalidad> getNacionalidadByPais(Context c, String paisCodigo);Obtiene la nacionalidad asociada a un país específico.
FutureTask<List<Nacionalidad>> getNacionalidadByStatus(Context c, Boolean pasivo);Obtiene las nacionalidades filtrando por su estado de vigencia (activo/pasivo).
FutureTask<List<Nacionalidad>> getNacionalidadesByNombre(Context c, String searchString);Busca nacionalidades cuya descripción coincida parcial o totalmente con el texto indicado.
FutureTask<List<Nacionalidad>> searchNacionalidadesByCriteria(Context c, C criteria);Realiza una búsqueda flexible de nacionalidades aplicando los criterios especificados.
País (PaisService)
MétodoDescripción
FutureTask<Pais> getPaisByCodigo(Context c, String codigo);Obtiene un país por su código identificador único.
FutureTask<List<Pais>> getPaisesByNombre(Context c, String searchString);Busca países cuyo nombre coincida parcial o totalmente con el texto indicado.
FutureTask<List<Pais>> getPaisesByStatus(Context c, Boolean pasivo);Obtiene los países filtrando por su estado de vigencia (activo/pasivo).
FutureTask<List<Pais>> searchPaisesByCriteria(Context c, C criteria);Realiza una búsqueda flexible de países aplicando los criterios especificados.
Provincia (ProvinciaService)
MétodoDescripción
FutureTask<Provincia> getProvinciaByCodigo(Context context, String codigo);Obtiene una provincia por su código identificador único.
FutureTask<List<Provincia>> getProvincias(Context context);Obtiene el catálogo completo de provincias disponibles.
FutureTask<List<Provincia>> getProvinciasByNombre(Context context, String nombre);Busca provincias cuyo nombre coincida parcial o totalmente con el texto indicado.
FutureTask<List<Provincia>> getProvinciasByComunidadAutonoma(Context context, String codigoComunidadAutonoma);Obtiene las provincias pertenecientes a una comunidad autónoma específica.
Tipo de Asistencia (TipoAsistenciaService)
MétodoDescripción
FutureTask<TipoAsistencia> getTipoAsistenciaByCodigo(Context context, String codigo);Obtiene un tipo de asistencia por su código identificador único.
FutureTask<List<TipoAsistencia>> getTiposAsistencia(Context context);Obtiene el catálogo completo de tipos de asistencia disponibles.
FutureTask<List<TipoAsistencia>> getTiposAsistenciasByNombre(Context context, String nombre);Busca tipos de asistencia cuya descripción coincida parcial o totalmente con el texto indicado.
FutureTask<List<TipoAsistencia>> getTiposAsistenciasByCentroAP(Context context, String codigoCentroAP);Obtiene los tipos de asistencia asociados a un centro de atención primaria.
Tipo de Profesional (TipoProfesionalService)
MétodoDescripción
FutureTask<TipoProfesional> getTipoProfesionalByCodigo(Context context, String codigo);Obtiene un tipo de profesional por su código identificador único.
FutureTask<List<TipoProfesional>> getTiposProfesionales(Context context);Obtiene el catálogo completo de tipos de profesional disponibles.
FutureTask<List<TipoProfesional>> getTiposProfesionalesByNombre(Context context, String nombre);Busca tipos de profesional cuya descripción coincida parcial o totalmente con el texto indicado.
Tipo de Vía (TiposViaService)
MétodoDescripción
FutureTask<TipoVia> getTipoViaByCodigo(Context c, String codigo);Obtiene un tipo de vía por su código identificador único.
FutureTask<List<TipoVia>> getTipoViaByIneType(Context c,String ineType);Obtiene los tipos de vía filtrando por el tipo específico del INE.
FutureTask<List<TipoVia>> getTipoViaByNombre(Context c,String nombre);Busca tipos de vía cuya descripción coincida parcial o totalmente con el texto indicado.
FutureTask<List<TipoVia>> getTipoViaByCriteria(Context c, C criteria);Realiza una búsqueda flexible de tipos de vía aplicando los criterios especificados.
Ubicación (UbicacionService)
MétodoDescripción
FutureTask<Ubicacion> getUbicacionByCodigo(Context context, TipoUbicacionEnum tipo, String codigo);Obtiene una ubicación sanitaria (cama, sala, etc.) por su código identificador único y tipo.
FutureTask<List<Ubicacion>> getUbicaciones(Context context, TipoUbicacionEnum tipo);Obtiene el catálogo completo de ubicaciones según el tipo especificado (camas, salas, etc.).
FutureTask<List<Ubicacion>> getUbicacionesByNombre(Context context, TipoUbicacionEnum tipo, String nombre);Busca ubicaciones de un tipo específico cuyo nombre coincida parcial o totalmente con el texto indicado.
FutureTask<List<Ubicacion>> getUbicacionesByArea(Context context, TipoUbicacionEnum tipo, String codigoAreaHospitalaria);Obtiene las ubicaciones de un tipo específico pertenecientes a un área hospitalaria.
FutureTask<List<Ubicacion>> getUbicacionesByCentro(Context context, TipoUbicacionEnum tipo, Long codigoCentro);Obtiene las ubicaciones de un tipo específico ubicadas en un centro sanitario.
FutureTask<List<Ubicacion>> getUbicacionesByPadre(Context context, TipoUbicacionEnum tipo, String codigoPadre);Obtiene las ubicaciones de un tipo específico dependientes de otra ubicación padre (jerarquía).
FutureTask<List<Ubicacion>> getUbicacionesByLastUpdate(Context context, Date lastUpdate);Obtiene las ubicaciones modificadas desde una fecha específica (útil para sincronización).
Unidad-Centro (UnidadCentroService)
MétodoDescripción
FutureTask<List<UnidadCentro>> getUnidadCentroByUnidad(Context context, String codigoUnidadFuncional);Obtiene las relaciones entre unidades funcionales y centros para una unidad funcional específica.
Unidad Funcional Especializada (UnidadFuncionalEspecializadaService)
MétodoDescripción
FutureTask<UnidadFuncionalEspecializada> getUnidadFuncionalByCodigo(Context context, String codigo);Obtiene una unidad funcional de atención especializada por su código identificador único.
FutureTask<List<UnidadFuncionalEspecializada>> getUnidadesFuncionales(Context context);Obtiene el catálogo completo de unidades funcionales de atención especializada.
FutureTask<List<UnidadFuncionalEspecializada>> getUnidadesFuncionalesByNombre(Context context, String nombre);Busca unidades funcionales de atención especializada cuyo nombre coincida parcial o totalmente con el texto indicado.
FutureTask<List<UnidadFuncionalEspecializada>> getUnidadesFuncionalesByCentro(Context context, String codigoCentro);Obtiene las unidades funcionales de atención especializada asociadas a un centro sanitario específico.
FutureTask<List<UnidadFuncionalEspecializada>> getUnidadesFuncionalesByArea(Context context, String codigoAreaHospitalaria);Obtiene las unidades funcionales de atención especializada pertenecientes a un área hospitalaria.
FutureTask<List<UnidadFuncionalEspecializada>> getUnidadesFuncionalesByFinalStatus(Context context,Boolean isFinal);Obtiene las unidades funcionales de atención especializada filtrando por su estado de vigencia (final/no final).
FutureTask<List<UnidadFuncionalEspecializada>> searchUnidadesFuncionalesEspecializada(Context context,String nombre,String codigoCentro,String codigoAreaHospitalaria,Boolean isFinal);Realiza una búsqueda combinada de unidades funcionales aplicando todos los filtros proporcionados simultáneamente.
Unidad Funcional Primaria (UnidadFuncionalPrimariaService)
MétodoDescripción
FutureTask<UnidadFuncionalPrimaria> getUnidadFuncionalByCodigo(Context context, String codigo);Obtiene una unidad funcional de atención primaria por su código identificador único.
FutureTask<List<UnidadFuncionalPrimaria>> getUnidadesFuncionales(Context context);Obtiene el catálogo completo de unidades funcionales de atención primaria.
FutureTask<List<UnidadFuncionalPrimaria>> getUnidadesFuncionalesByNombre(Context context, String nombre);Busca unidades funcionales de atención primaria cuyo nombre coincida parcial o totalmente con el texto indicado.
FutureTask<List<UnidadFuncionalPrimaria>> getUnidadesFuncionalesByCentroAPSede(Context context, String codigoCentroAP);Obtiene las unidades funcionales de atención primaria físicamente ubicadas en la sede de un centro de atención primaria.
FutureTask<List<UnidadFuncionalPrimaria>> getUnidadesFuncionalesByCentroAPActividad(Context context, String codigoCentroAP);Obtiene las unidades funcionales de atención primaria asociadas a la actividad clínica de un centro de atención primaria.
Zona Básica (ZonaBasicaService)
MétodoDescripción
FutureTask<ZonaBasica> getZonaBasicaByCodigo(Context c, String codigoZB);Obtiene una zona básica de salud por su código identificador único.
FutureTask<List<ZonaBasica>> getZonasBasicasByDistrito(Context c, String codigo);Obtiene las zonas básicas de salud asignadas a un distrito sanitario específico.
FutureTask<List<ZonaBasica>> getZonasBasicasReconvertidas(Context c, Boolean reconvertida, Date fechaDesde, Date fechaHasta);Obtiene las zonas básicas de salud que han sufrido procesos de reconversión en un periodo determinado.
FutureTask<List<ZonaBasica>> getZonasBasicasByTipo(Context c, TipoZonaBasicaEnum tipo);Obtiene las zonas básicas de salud filtrando por su tipo específico.
FutureTask<List<ZonaBasica>> getZonasBasicas(Context c);Obtiene el catálogo completo de zonas básicas de salud disponibles.
FutureTask<List<ZonaBasica>> getZonasBasicasByCriteria(Context c,C criteria);Realiza una búsqueda flexible de zonas básicas de salud aplicando los criterios especificados.


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


Versión < 3.0.0

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.


Versión >= 3.0.0

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:

Versión < 3.0.0
Pom módulo uso
<!-- 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> 

Versión >= 3.0.0
Pom Padre
 <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> 
Pom módulo uso
<!-- 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

Versión < 3.0.0

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"

Versión >= 3.0.0

En Openliberty >= 24.X.X.X:


server.xml
<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>
persistence-config-oracle-estructura.xml
<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:

pom.xml del boot
  <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:

<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.

Versión < 3.0.0


Estructura EntityManager Config
@Singleton
@Startup
public class DaoEntityManagerConfig {

    @PersistenceContext(unitName = "Diraya-Estructura-Persistence-Unit")
    private EntityManager estructuraEntityManager;

    @PostConstruct
    public void init() {
        EntityManagerContainer.setEntityManager(estructuraEntityManager);
    }

}


Versión >= 3.0.0
Estructura EntityManager Config
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:

Versión < 3.0.0


Productor Estructura Api Config
@Produces
@Singleton
public EstructuraApiConfig producerEstructuraApiConfig() {
	return new EstructuraApiConfigBuilder().executorPoolSize(20).build();
}


Versión >= 3.0.0
Productor Estructura Api Config
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.
      

7. JavaDoc y Código Fuente

Toda la documentación del proyecto en forma de JavaDoc, así como el código fuente del mismo, se encuentra desplegado al Artifactory del SAS, por lo que el programador podrá descargarlo y consultarlo para ver el detalle de todas las clases de la librería.
Se recomienda especialmente consultar JavaDoc de los servicios principales de la API (AreaConocimientoService, AreaHospitalariaService, etc), donde podrá ver el detalle de todas las operaciones permitidas actualmente.

Pruebas de carga

Contexto:

  • Base de datos: Entornos de desarrollo de DAE, réplica de Estructura
  • Servidor web: Servicios REST publicados en una aplicación de ejemplo. Internamente hace uso de la API de Estructura
    • Intel Core i7 2520M 2.5GHz
    • 8GB Ram
    • Windows 7 64Bits
    • Weblogic 12.1.3 (1GB Ram)
  • Cliente REST: jMeter 3.0

Pruebas:

En la siguiente captura puede observarse un rendimiento de unas 1000 peticiones por segundo en las pruebas de carga realizadas.



Sobre los errores producidos, se deben a urls mal formadas: