Tiamat es el registro de lugares de parada. Se utiliza a nivel nacional en Noruega y otros lugares. Tiamat está creado con tecnologías como Spring Boot, Hibernate, Postgis, Jersey y Jackson.
Admite la exportación de paradas y otras entidades al formato http://netex-cen.eu/. Hay muchas opciones para las exportaciones:
Tiamat proporciona una rica API GraphQL para lugares de parada, lugares topográficos, enlaces de rutas, zonas arancelarias, etc., y admite los mismos parámetros que la API de exportación NeTEx. También soporta mutaciones. Para que pueda actualizar o crear entidades. También hay procesos Graphql (funciones con nombre) que permiten funciones como fusionar muelles o lugares de parada.
Hay disponible una interfaz para Tiamat. Su nombre es Abzu. Ver https://github.com/entur/abzu
Tiamat utiliza la cuadrícula de memoria Hazelcast para comunicarse con otras instancias en Kubernetes. Esto significa que puede ejecutar varias instancias.
Después de importar los lugares de parada y asignar nuevos ID a los lugares de parada, tiamat mantiene los ID antiguos en una tabla de mapeo. La tabla de mapeo entre ID antiguos y nuevos está disponible a través de la API GraphQL y un punto final REST.
Tiamat permite buscar y completar referencias a zonas tarifarias y lugares topográficos a partir de coincidencias de polígonos al guardar un lugar de parada.
Las paradas y otras entidades están versionadas. Esto significa que tiene el historial de versiones completo de los lugares de parada y la persona que realizó esos cambios. Tiamat también incluye una herramienta de diferenciación. Esto se utiliza para comparar y mostrar la diferencia entre dos versiones de un lugar de parada (u otra entidad).
mvn clean install
Necesita el directorio /deployments/data
con derechos para el usuario que realiza la compilación.
Tiamat utiliza contenedores de prueba para ejecutar pruebas de integración en una base de datos real. Para ejecutar pruebas basadas en Testcontainers, necesita un tiempo de ejecución de contenedor compatible con Docker-API. Para obtener más detalles, consulte https://www.testcontainers.org/supported_docker_environment/
(los perfiles predeterminados se establecen en application.properties)
Para ejecutar Tiamat con Docker Compose, necesita tener un archivo docker-compose.yml. En la carpeta docker-compose encontrará un archivo compose.yml:
docker compose up
Esto iniciará Tiamat con PostgreSQL y Hazelcast. y puede acceder a Tiamat en http://localhost:1888 y a la base de datos en http://localhost:5433 y a Graphiql en http://localhost:8777/services/stop_places/graphql. Al iniciar tiamat, copie el esquema vacío en base de datos. Las propiedades de Spring se establecen en application.properties. La seguridad está deshabilitada en esta configuración.
Para ejecutar PostgreSQL necesita una aplicación externa.properties. A continuación se muestra un ejemplo de application.properties:
spring.jpa.database=POSTGRESQL
spring.datasource.platform=postgres
spring.jpa.properties.hibernate.hbm2ddl.import_files_sql_extractor=org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor
spring.jpa.hibernate.hbm2ddl.import_files_sql_extractor=org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor
spring.jpa.hibernate.ddl-auto=none
spring.http.gzip.enabled=true
#spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.order_updates=true
spring.jpa.properties.hibernate.batch_versioned_data=true
spring.flyway.enabled=true
spring.flyway.table =schema_version
server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain
spring.jpa.hibernate.id.new_generator_mappings=true
spring.jpa.hibernate.use-new-id-generator-mappings=true
spring.jpa.properties.hibernate.cache.use_second_level_cache=false
spring.jpa.properties.hibernate.cache.use_query_cache=false
spring.jpa.properties.hibernate.cache.use_minimal_puts=false
spring.jpa.properties.hibernate.cache.region.factory_class=org.rutebanken.tiamat.hazelcast.TiamatHazelcastCacheRegionFactory
netex.import.enabled.types=MERGE,INITIAL,ID_MATCH,MATCH
hazelcast.performance.monitoring.enabled=true
hazelcast.performance.monitoring.delay.seconds=2
management.endpoints.web.exposure.include=info,env,metrics
management.endpoints.prometheus.enabled=true
management.metrics.endpoint.export.prometheus.enabled=true
spring.jpa.properties.hibernate.jdbc.batch_size=20
spring.jpa.properties.hibernate.default_batch_fetch_size=16
spring.jpa.properties.hibernate.generate_statistics=false
changelog.publish.enabled=false
jettyMaxThreads=10
jettyMinThreads=1
spring.datasource.hikari.maximumPoolSize=40
spring.datasource.hikari.leakDetectionThreshold=30000
tiamat.locals.language.default=eng
tariffZoneLookupService.resetReferences=true
debug=true
# Disable feature detection by this undocumented parameter. Check the org.hibernate.engine.jdbc.internal.JdbcServiceImpl.configure method for more details.
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults = false
# Because detection is disabled you have to set correct dialect by hand.
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL9Dialect
tariffzoneLookupService.resetReferences=true
spring.jpa.properties.hibernate.dialect=org.hibernate.spatial.dialect.postgis.PostgisDialect
spring.database.driverClassName=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5436/tiamat
spring.datasource.username=tiamat
spring.datasource.password=tiamat
#OAuth2 Resource Server
spring.security.oauth2.resourceserver.jwt.issuer-uri=https:http://localhost:8082/realms/entur
tiamat.oauth2.resourceserver.auth0.ror.jwt.audience=abzu
tiamat.oauth2.resourceserver.auth0.ror.claim.namespace=role_assignments
spring.cloud.gcp.pubsub.enabled=false
aspect.enabled=true
netex.id.valid.prefix.list={TopographicPlace:{'KVE','WOF','OSM','ENT','LAN'},TariffZone:{'*'},FareZone:{'*'},GroupOfTariffZones:{'*'}}
server.port=1888
blobstore.gcs.blob.path=exports
blobstore.gcs.bucket.name=tiamat-test
blobstore.gcs.credential.path=gcloud-storage.json
blobstore.gcs.project.id=carbon-1287
security.basic.enabled=false
management.security.enabled=false
authorization.enabled = true
rutebanken.kubernetes.enabled=false
async.export.path=/tmp
publicationDeliveryUnmarshaller.validateAgainstSchema=false
publicationDeliveryStreamingOutput.validateAgainstSchema=false
netex.validPrefix=NSR
netex.profile.version=1.12:NO-NeTEx-stops:1.4
blobstore.local.folder=/tmp/local-gcs-storage/tiamat/export
spring.profiles.active=local-blobstore,activemq
Para iniciar Tiamat con esta configuración, especifique spring.config.location :
java -jar -Dspring.config.location=/path/to/tiamat.properties --add-opens java.base/java.lang=ALL-UNNAMED -Denv=dev tiamat-0.0.2-SNAPSHOT.jar
Tiamat está usando HikariCP. La mayoría de las propiedades deberían poder especificarse en application.properties, como spring.datasource.initializationFailFast=false
. Más información aquí. https://github.com/brettwooldridge/HikariCP/wiki/Configuration Véase también http://stackoverflow.com/a/26514779
docker run -it -d -p 5435:5432 --name postgress-13 -e POSTGRES_USER=tiamat -e POSTGRES_PASSWORD="tiamat" -e POSTGRES_INITDB_ARGS="-d" postgis/postgis:13-master
Durante la implementación de Tiamat era deseable producir ID NeTEx para los lugares de parada con un espacio más o menos reducido. El motivo de esta implementación fueron los sistemas heredados con restricciones de número máximo de dígitos.
Es posible controlar si las identificaciones deben generarse fuera de Tiamat o no. Vea la clase ValidPrefixList. Establecer la propiedad netex.validPrefix
le dice a Tiamat que genere ID para nuevas entidades. Tenga en cuenta que no es posible realizar una importación inicial (consulte ImportType) varias veces con los mismos ID.
Todo lo inicia una entidad oyente anotada con PrePersist
en la clase IdentifiedEntity
llamada IdentifiedEntityListener
. NetexIdAssigner
determina si la entidad ya tiene un ID o no. NetexIdProvider
devuelve un nuevo ID o maneja los ID reclamados explícitamente si el prefijo configurado coincide. Consulte ValidPrefixList
para conocer la configuración de prefijos válidos y prefijos para ID generados en otros lugares. GaplessIdGeneratorService
utiliza Hazelcast para sincronizar el estado entre instancias y evitar conflictos.
Tanto Tiamat como Abzu están configurados para usarse con Keycloak o Auth0. Puede encontrar una guía detallada sobre cómo configurar Keycloak aquí.
Es posible configurar si tiamat debe validar el xml NeTEx entrante y saliente al desclasificar o ordenar las entregas de publicaciones. Los valores predeterminados son verdaderos. Se puede desactivar estableciendo las propiedades en falso.
publicationDeliveryStreamingOutput.validateAgainstSchema=false
publicationDeliveryUnmarshaller.validateAgainstSchema=true
Es posible exportar paradas y lugares topográficos directamente al formato NeTEx. Este es el punto final: https://api.dev.entur.io/stop-places/v1/netex
https://api.dev.entur.io/stop-places/v1/netex?q=Arne%20Garborgs%20vei
https://api.dev.entur.io/stop-places/v1/netex?q=3115
https://api.dev.entur.io/stop-places/v1/netex?stopPlaceType=RAIL_STATION
También es posible con varios tipos.
https://api.dev.entur.io/stop-places/v1/netex?municipalityReference=KVE:TopographicPlace:1003
https://api.dev.entur.io/stop-places/v1/netex?countyReference=KVE:TopographicPlace:11
https://api.dev.entur.io/stop-places/v1/netex?size=1000
https://api.dev.entur.io/stop-places/v1/netex?page=1
Puede especificar una lista de ID de lugares de parada de NSR para devolver
https://api.dev.entur.io/stop-places/v1/netex?idList=NSR:StopPlace:3378&idList=NSR:StopPlace:123
allVersions
. Los valores aceptables son verdadero o falso. Si se establece en verdadero, se devolverán todas las versiones de los lugares de parada coincidentes. Si se establece en falso, se devolverá la versión más alta por número para los lugares de parada coincidentes. Este parámetro no está habilitado cuando se utiliza el parámetro de valor de versión.
Coincidir solo con lugares de parada sin ubicación Utilice el parámetro: withoutLocationOnly=true
El parámetro topographicPlaceExportMode
se puede establecer en NONE , RELEVANT o ALL. Los lugares topográficos relevantes se encontrarán en la lista exportada de lugares de parada.
El parámetro tariffZoneExportMode
se puede configurar en NINGUNO , RELEVANTE o TODAS Las zonas arancelarias relevantes se encontrarán en la lista exportada de lugares de parada. Porque las paradas pueden tener una lista de referencias de zonas tarifarias.
El parámetro groupOfStopPlacesExportMode
se puede establecer en NONE , RELEVANT o ALL. El grupo relevante de lugares de parada se puede encontrar en la lista exportada de lugares de parada.
El parámetro versionValidity
controla qué lugares de parada se deben devolver.
https://api.dev.entur.io/stop-places/v1/netex?tariffZoneExportMode=RELEVANT&topographicPlaceExportMode=RELEVANT&groupOfStopPlacesExportMode=NONE&q=Nesbru&versionValidity=CURRENT&municipalityReference=KVE:TopographicPlace:0220
Devuelve lugares de parada con validez de versión actual, que coinciden con la consulta 'Nesbru' y existen en el municipio 0220. Obtiene zonas tarifarias y lugares topográficos relevantes.
Las cargas de exportación asincrónicas exportaron datos al almacenamiento en la nube de Google. Cuando se inicie, obtendrá una identificación de trabajo. Cuando finalice el trabajo, podrá descargar los datos exportados.
¡La mayoría de los parámetros de la exportación sincrónica también funcionan con la exportación asincrónica!
curl https://api.dev.entur.io/stop-places/v1/netex/export/initiate
Consejo profesional: canalice la salida de curl a xmllint para formatear la salida:
curl https://api.dev.entur.io/stop-places/v1/netex/export/initiate | xmllint --format -
curl https://api.dev.entur.io/stop-places/v1/netex/export
curl https://api.dev.entur.io/stop-places/v1/netex/export/130116/content | zcat | xmllint --format - > export.xml
Véase también https://rutebanken.atlassian.net/browse/NRP-924
Limpiar datos existentes en postgresql (optimizar si se usan con frecuencia):
TRUNCATE stop_place CASCADE;
TRUNCATE quay CASCADE;
TRUNCATE topographic_place CASCADE;
Si está ejecutando esto desde spring:run
, debe asegurarse de tener suficiente memoria disponible para el proceso de Java (en caso de grandes conjuntos de datos). Otro problema es el tamaño de la pila de subprocesos, que podría ser necesario aumentar cuando se trata de importaciones NeTEx realmente grandes. Ejemplo:
export MAVEN_OPTS='-Xms256m -Xmx1712m -Xss256m -XX:NewSize=64m -XX:MaxNewSize=128m -Dfile.encoding=UTF-8'
Este archivo NeTEx no debe contener el ID de NSR. (El prefijo NSR es configurable en la clase ValidPrefixList)
Tiamat devolverá la estructura NeTEx modificada con sus propios ID de NSR. Las identificaciones originales estarán presentes en la lista de valores clave de cada objeto.
curl -XPOST -H"Content-Type: application/xml" [email protected] http://localhost:1997/services/stop_places/netex
Al importar con importType=INITIAL , se creará una secuencia paralela que generará el proceso original. Durante la importación se comprueban las autorizaciones de los usuarios, accediendo así a SecurityContextHolder. De forma predeterminada, SecurityContextHolder usa DEFAULT_LOCAL_STRATEGY. Cuando use INITIAL importType, debe decirle a Spring que use MODE_INHERITABLETHREADLOCAL para SecurityContextHolder, lo que le permitirá a Spring duplicar el contexto de seguridad en los subprocesos generados. Esto se puede hacer configurando la variable env:
-Dspring.security.strategy=MODE_INHERITABLETHREADLOCAL
De lo contrario, la aplicación puede quejarse de que el usuario no está autenticado si Spring intenta verificar la autorización en un proceso generado.
El punto final GraphQL está disponible en
https://api.dev.entur.io/stop-places/v1/graphql
Consejo: UI de GraphiQL disponible en https://api.dev.entur.io/graphql-explorer/stop-places usando GraphiQL : https://github.com/graphql/graphiql (use, por ejemplo, Modify Headers
para Chrome para agregar portadores). token para mutaciones)
Para crear la base de datos para tiamat, descargue y utilice la herramienta de línea de comandos flyway: https://flywaydb.org/documentation/commandline/
Las migraciones se ejecutan cuando se inicia tiamat.
Cree un nuevo archivo de acuerdo con la documentación de la ruta migratoria en la carpeta resources/db/migrations
. Confirme la migración junto con los cambios de código que requieren este cambio de esquema. Siga la convención de nomenclatura.
Aquí se han recopilado varias consultas y scripts relacionados con tiamat: https://github.com/entur/tiamat-scripts
Tiamat se construye utilizando CircleCI. Vea la carpeta .circleci.