## ---------------------------------------------------------------------------
## Licensed to the Apache Software Foundation (ASF) under one or more
## contributor license agreements.  See the NOTICE file distributed with
## this work for additional information regarding copyright ownership.
## The ASF licenses this file to You under the Apache License, Version 2.0
## (the "License"); you may not use this file except in compliance with
## the License.  You may obtain a copy of the License at
##
##      http://www.apache.org/licenses/LICENSE-2.0
##
## Unless required by applicable law or agreed to in writing, software
## distributed under the License is distributed on an "AS IS" BASIS,
## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
## See the License for the specific language governing permissions and
## limitations under the License.
## ---------------------------------------------------------------------------
#
# Quarkus
#
quarkus.ssl.native=true

#
# Quarkus :: Camel :: FHIR
#
# The HAPI-FHIR library, on which camel-fhir depends on, heavily uses reflection which affects performance in Quarkus
# (memory footprint, build time, CPU resources etc...). For the sake of time, only R4 (which is the default FHIR
# version supported by the test server)
#
quarkus.camel.fhir.enable-dstu2=false
quarkus.camel.fhir.enable-dstu3=true
quarkus.camel.fhir.enable-r4=false
quarkus.camel.fhir.enable-r5=false

#
# Camel :: FHIR
#
camel.component.fhir.configuration = #class:org.apache.camel.component.fhir.FhirConfiguration
camel.component.fhir.configuration.log = false
camel.component.fhir.configuration.server-url = {{camel.fhir.test-url}}
