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

#Configuration Type values {'nobroker', 'kafka'}
router.config.type=${org.apache.unomi.router.config.type:-nobroker}

#Kafka (only used if configuration type is set to kafka
kafka.host=${org.apache.unomi.router.kafka.host:-localhost}
kafka.port=${org.apache.unomi.router.kafka.port:-9092}
kafka.import.topic=${org.apache.unomi.router.kafka.import.topic:-import-deposit}
kafka.export.topic=${org.apache.unomi.router.kafka.export.topic:-export-deposit}
kafka.import.groupId=${org.apache.unomi.router.kafka.import.groupId:-unomi-import-group}
kafka.export.groupId=${org.apache.unomi.router.kafka.export.groupId:-unomi-import-group}
kafka.consumerCount=${org.apache.unomi.router.kafka.consumerCount:-10}
kafka.autoCommit=${org.apache.unomi.router.kafka.autoCommit:-true}

#Import One Shot upload directory
import.oneshot.uploadDir=${org.apache.unomi.router.import.oneshot.uploadDir:-${karaf.data}/tmp/unomi_oneshot_import_configs/}

#Import/Export executions history size
executionsHistory.size=${org.apache.unomi.router.executionsHistory.size:-5}

#errors report size
executions.error.report.size=${org.apache.unomi.router.executions.error.report.size:-200}

#Allowed source endpoints
config.allowedEndpoints=${org.apache.unomi.router.config.allowedEndpoints:-file,ftp,sftp,ftps}