Tiamat adalah Tempat Perhentian Daftar. Ini digunakan secara nasional di Norwegia, dan tempat lain. Tiamat dibuat dengan teknologi seperti Spring Boot, Hibernate, Postgis, Jersey dan Jackson.
Mendukung ekspor tempat perhentian dan entitas lain ke format http://netex-cen.eu/. Ada banyak pilihan untuk ekspor:
Tiamat menyediakan API GraphQL yang kaya untuk tempat perhentian, tempat topografi, tautan jalur, zona tarif, dan sebagainya, mendukung parameter yang sama dengan API ekspor NeTEx. Ini juga mendukung mutasi. Jadi Anda dapat memperbarui atau membuat entitas. Ada juga proses graphql (bernama fungsi) yang memungkinkan fungsionalitas seperti menggabungkan dermaga atau tempat pemberhentian.
Frontend untuk Tiamat tersedia. Namanya Abzu. Lihat https://github.com/entur/abzu
Tiamat menggunakan jaringan memori Hazelcast untuk berkomunikasi dengan instance lain di kubernetes. Ini berarti Anda dapat menjalankan banyak instance.
Setelah mengimpor tempat perhentian dan menetapkan ID baru ke tempat perhentian, tiamat menyimpan ID lama dalam tabel pemetaan. Tabel pemetaan antara ID lama dan baru tersedia melalui API GraphQL dan titik akhir REST.
Tiamat mendukung pencarian dan pengisian referensi ke zona tarif dan tempat topografi dari pencocokan poligon saat menyimpan tempat perhentian.
Tempat perhentian dan entitas lain dibuat versinya. Ini berarti Anda memiliki riwayat versi lengkap tempat perhentian dan orang yang melakukan perubahan tersebut. Tiamat juga menyertakan alat diff. Ini digunakan untuk membandingkan dan menunjukkan perbedaan antara dua versi tempat perhentian (atau entitas lainnya).
mvn clean install
Anda memerlukan direktori /deployments/data
dengan hak untuk pengguna yang melakukan pembangunan.
Tiamat menggunakan testcontainer untuk menjalankan tes integrasi terhadap database nyata. Untuk menjalankan pengujian berbasis Testcontainers, Anda memerlukan runtime container yang kompatibel dengan Docker-API untuk detail lebih lanjut, lihat https://www.testcontainers.org/supported_docker_environment/
(profil default diatur di application.properties)
Untuk menjalankan Tiamat dengan penulisan Docker, Anda harus memiliki file docker-compose.yml. Di folder docker-compose Anda akan menemukan file composer.yml.:
docker compose up
Ini akan memulai Tiamat dengan PostgreSQL dan Hazelcast. dan Anda dapat mengakses Tiamat di http://localhost:1888 dan database di http://localhost:5433 dan graphiql di http://localhost:8777/services/stop_places/graphql , Saat memulai tiamat, salin skema kosong ke basis data. Properti pegas diatur di application.properties. Keamanan dinonaktifkan dalam pengaturan ini.
Untuk menjalankan dengan PostgreSQL Anda memerlukan properti aplikasi eksternal. Di bawah ini adalah contoh 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
Untuk memulai Tiamat dengan konfigurasi ini, tentukan 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 menggunakan HikariCP. Sebagian besar properti seharusnya dapat ditentukan dalam application.properties, seperti spring.datasource.initializationFailFast=false
. Informasi lebih lanjut di sini. https://github.com/brettwooldridge/HikariCP/wiki/Configuration Lihat juga 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
Selama implementasi Tiamat diinginkan untuk menghasilkan ID NeTEx untuk tempat perhentian dengan jarak yang lebih atau kurang. Alasan penerapan ini adalah sistem lama dengan batasan jumlah digit maksimum.
Dimungkinkan untuk mengontrol apakah ID harus dibuat di luar Tiamat atau tidak. Lihat kelas ValidPrefixList. Menyetel properti netex.validPrefix
memberitahu Tiamat untuk membuat ID untuk entitas baru. Harap dicatat bahwa tidak mungkin melakukan impor awal (lihat ImportType) beberapa kali dengan ID yang sama.
Semuanya dimulai oleh pendengar entitas yang dianotasi dengan PrePersist
di kelas IdentifiedEntity
yang disebut IdentifiedEntityListener
. NetexIdAssigner
menentukan apakah entitas sudah memiliki ID atau belum. NetexIdProvider
mengembalikan ID baru atau menangani ID yang diklaim secara eksplisit jika awalan yang dikonfigurasi cocok. Lihat ValidPrefixList
untuk konfigurasi awalan yang valid, dan awalan untuk ID yang dihasilkan di tempat lain. GaplessIdGeneratorService
menggunakan Hazelcast untuk menyinkronkan status antar instance dan menghindari konflik.
Tiamat dan Abzu diatur untuk digunakan dengan Keycloak atau Auth0. Panduan terperinci tentang cara mengatur Keycloak dapat ditemukan di sini.
Dimungkinkan untuk mengonfigurasi apakah tiamat harus memvalidasi NeTEx xml yang masuk dan keluar saat melakukan unmarshalling atau menyusun pengiriman publikasi. Nilai default adalah benar. Dapat dinonaktifkan dengan mengatur properti ke false.
publicationDeliveryStreamingOutput.validateAgainstSchema=false
publicationDeliveryUnmarshaller.validateAgainstSchema=true
Dimungkinkan untuk mengekspor tempat perhentian dan tempat topografi langsung ke format NeTEx. Ini adalah titik akhirnya: 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
Hal ini juga dimungkinkan dengan berbagai jenis.
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
Anda dapat menentukan daftar ID tempat perhentian NSR untuk dikembalikan
https://api.dev.entur.io/stop-places/v1/netex?idList=NSR:StopPlace:3378&idList=NSR:StopPlace:123
allVersions
. Nilai yang dapat diterima adalah benar atau salah. Jika disetel ke true, semua versi tempat perhentian yang cocok akan dikembalikan. Jika disetel ke false, versi tertinggi berdasarkan nomor akan dikembalikan untuk tempat perhentian yang cocok. Parameter ini tidak diaktifkan saat menggunakan parmaeter validitas versi.
Hanya cocokkan tempat perhentian tanpa lokasi Gunakan parameter: withoutLocationOnly=true
Parameter topographicPlaceExportMode
dapat diatur ke NONE , RELEVANT atau SEMUA Tempat topografi yang relevan akan ditemukan dari daftar tempat perhentian yang diekspor.
Parameter tariffZoneExportMode
dapat diatur ke NONE , RELEVANT atau ALL Relevant zona tarif yang dapat ditemukan dari daftar tempat perhentian yang diekspor. Karena tempat pemberhentian bisa mempunyai daftar referensi zona tarif.
Parameter groupOfStopPlacesExportMode
dapat diatur ke NONE , RELEVANT atau ALL Grup tempat perhentian yang relevan dapat ditemukan dari daftar tempat perhentian yang diekspor.
Parameter versionValidity
mengontrol tempat perhentian untuk kembali.
https://api.dev.entur.io/stop-places/v1/netex?tariffZoneExportMode=RELEVANT&topographicPlaceExportMode=RELEVANT&groupOfStopPlacesExportMode=NONE&q=Nesbru&versionValidity=CURRENT&municipalityReference=KVE:TopographicPlace:0220
Pengembalian tempat perhentian dengan validitas versi saat ini, cocok dengan kueri 'Nesbru' dan ada di kotamadya 0220. Mengambil zona tarif dan tempat topografi yang relevan.
Ekspor asinkron mengunggah data yang diekspor ke penyimpanan cloud Google. Saat dimulai, Anda akan mendapatkan ID pekerjaan kembali. Ketika pekerjaan selesai, Anda dapat mengunduh data yang diekspor.
Sebagian besar parameter dari ekspor sinkron juga berfungsi dengan ekspor asinkron!
curl https://api.dev.entur.io/stop-places/v1/netex/export/initiate
Kiat pro: Pipa output dari curl ke xmllint untuk memformat output:
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
Lihat juga https://rutebanken.atlassian.net/browse/NRP-924
Bersihkan data yang ada di postgresql (efisienkan jika sering digunakan):
TRUNCATE stop_place CASCADE;
TRUNCATE quay CASCADE;
TRUNCATE topographic_place CASCADE;
Jika Anda menjalankan ini dari spring:run
, maka Anda perlu memastikan bahwa Anda memiliki cukup memori yang tersedia untuk proses Java (jika kumpulan datanya besar). Masalah lainnya adalah ukuran tumpukan thread, yang mungkin perlu ditingkatkan ketika menghadapi impor NeTEx yang sangat besar. Contoh:
export MAVEN_OPTS='-Xms256m -Xmx1712m -Xss256m -XX:NewSize=64m -XX:MaxNewSize=128m -Dfile.encoding=UTF-8'
File NeTEx ini tidak boleh berisi ID NSR. (Awalan NSR dapat dikonfigurasi di kelas ValidPrefixList)
Tiamat akan mengembalikan struktur NeTEx yang dimodifikasi dengan ID NSR miliknya. ID asli akan ada dalam daftar nilai kunci pada setiap objek.
curl -XPOST -H"Content-Type: application/xml" [email protected] http://localhost:1997/services/stop_places/netex
Saat mengimpor dengan importType=INITIAL , aliran paralel akan dibuat, memunculkan proses aslinya. Selama impor, otorisasi pengguna diperiksa, sehingga mengakses SecurityContextHolder. Secara default, SecurityContextHolder menggunakan DEFAULT_LOCAL_STRATEGY. Saat menggunakan importType AWAL, Anda harus memberi tahu Spring untuk menggunakan MODE_INHERITABLETHREADLOCAL untuk SecurityContextHolder, yang memungkinkan Spring menduplikasi Konteks Keamanan di thread yang muncul. Ini dapat dilakukan dengan mengatur variabel env :
-Dspring.security.strategy=MODE_INHERITABLETHREADLOCAL
Jika tidak, aplikasi mungkin mengeluh tentang pengguna yang tidak diautentikasi jika Spring mencoba memeriksa otorisasi dalam proses yang muncul
Titik akhir GraphQL tersedia di
https://api.dev.entur.io/stop-places/v1/graphql
Tip: GraphiQL UI tersedia di https://api.dev.entur.io/graphql-explorer/stop-places menggunakan GraphiQL : https://github.com/graphql/graphiql (Gunakan misalnya Modify Headers
untuk Chrome untuk menambahkan pembawa- token untuk mutasi)
Untuk membuat database tiamat, unduh dan gunakan alat baris perintah jalur terbang: https://flywaydb.org/documentation/commandline/
Migrasi dijalankan ketika tiamat dimulai.
Buat file baru sesuai dengan dokumentasi jalur terbang di folder resources/db/migrations
. Lakukan migrasi bersama dengan perubahan kode yang memerlukan perubahan skema ini. Ikuti konvensi penamaan.
Berbagai pertanyaan dan skrip terkait tiamat, telah dikumpulkan di sini: https://github.com/entur/tiamat-scripts
Tiamat dibangun menggunakan CircleCI. Lihat folder .circleci.