#  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 properties for the File Manager

# repository factory
filemgr.repository.factory=org.apache.oodt.cas.filemgr.repository.XMLRepositoryManagerFactory

# catalog factory
filemgr.catalog.factory=org.apache.oodt.cas.filemgr.catalog.LuceneCatalogFactory

# data transfer factory
filemgr.datatransfer.factory=org.apache.oodt.cas.filemgr.datatransfer.LocalDataTransferFactory

# validation layer factory
filemgr.validationLayer.factory=org.apache.oodt.cas.filemgr.validation.XMLValidationLayerFactory

# xml rpc client configuration
org.apache.oodt.cas.filemgr.system.xmlrpc.connectionTimeout.minutes=20
org.apache.oodt.cas.filemgr.system.xmlrpc.requestTimeout.minutes=60
#org.apache.oodt.cas.filemgr.system.xmlrpc.connection.retries=0
#org.apache.oodt.cas.filemgr.system.xmlrpc.connection.retry.interval.seconds=3

# data source catalog configuration
org.apache.oodt.cas.filemgr.catalog.datasource.jdbc.url=some_jdbc_url
org.apache.oodt.cas.filemgr.catalog.datasource.jdbc.user=user
org.apache.oodt.cas.filemgr.catalog.datasource.jdbc.pass=pass
org.apache.oodt.cas.filemgr.catalog.datasource.jdbc.driver=driver.class.name
org.apache.oodt.cas.filemgr.catalog.datasource.quoteFields=false
org.apache.oodt.cas.filemgr.catalog.datasource.pageSize=20
org.apache.oodt.cas.filemgr.catalog.datasource.cacheUpdateMinutes=5

# mapped data source catalog configuration
org.apache.oodt.cas.filemgr.catalog.mappeddatasource.mapFile=/path/to/ops.catalog.typemap.properties

# science data catalog configuration
org.apache.oodt.cas.filemgr.catalog.science.jdbc.url=some_jdbc_url
org.apache.oodt.cas.filemgr.catalog.science.jdbc.user=user
org.apache.oodt.cas.filemgr.catalog.science.jdbc.pass=pass
org.apache.oodt.cas.filemgr.catalog.science.jdbc.driver=driver.class.name

# lucene catalog configuration
org.apache.oodt.cas.filemgr.catalog.lucene.idxPath=/path/to/your/lucene/index
org.apache.oodt.cas.filemgr.catalog.lucene.pageSize=20
org.apache.oodt.cas.filemgr.catalog.lucene.commitLockTimeout.seconds=60
org.apache.oodt.cas.filemgr.catalog.lucene.writeLockTimeout.seconds=60
org.apache.oodt.cas.filemgr.catalog.lucene.mergeFactor=20

# data source repository manager configuration
org.apache.oodt.cas.filemgr.repositorymgr.datasource.jdbc.url=some_jdbc_url
org.apache.oodt.cas.filemgr.repositorymgr.datasource.jdbc.user=user
org.apache.oodt.cas.filemgr.repositorymgr.datasource.jdbc.pass=pass
org.apache.oodt.cas.filemgr.repositorymgr.datasource.jdbc.driver=driver.class.name

# science data repository manager configuration
org.apache.oodt.cas.filemgr.repositorymgr.science.jdbc.url=some_jdbc_url
org.apache.oodt.cas.filemgr.repositorymgr.science.jdbc.user=user
org.apache.oodt.cas.filemgr.repositorymgr.science.jdbc.pass=pass
org.apache.oodt.cas.filemgr.repositorymgr.science.jdbc.driver=driver.class.name

# XML repository manager configuration
org.apache.oodt.cas.filemgr.repositorymgr.dirs=file:///dir1,file:///dir2

# XML validation layer configuration
org.apache.oodt.cas.filemgr.validation.dirs=file:///dir1,file:///dir2

# data source validation layer configuration
org.apache.oodt.cas.filemgr.validation.datasource.jdbc.url=some_jdbc_url
org.apache.oodt.cas.filemgr.validation.datasource.jdbc.user=user
org.apache.oodt.cas.filemgr.validation.datasource.jdbc.pass=pass
org.apache.oodt.cas.filemgr.validation.datasource.jdbc.driver=driver.class.name
org.apache.oodt.cas.filemgr.validation.datasource.quoteFields=false

# science data validation layer configuration
org.apache.oodt.cas.filemgr.validation.science.jdbc.url=some_jdbc_url
org.apache.oodt.cas.filemgr.validation.science.jdbc.user=user
org.apache.oodt.cas.filemgr.validation.science.jdbc.pass=pass
org.apache.oodt.cas.filemgr.validation.science.jdbc.driver=driver.class.name

# remote data transfer configuration
org.apache.oodt.cas.filemgr.datatransfer.remote.chunkSize=1024

# location of Mime-Type repository
org.apache.oodt.cas.filemgr.mime.type.repository=/path/to/mime-types.xml

# tells the file manager system layer to include product instance metadata
# NOTE: here are the expected field mappings
#
#      product.getProductId() -> ProductId
#      product.getProductName() -> ProductName
#      product.getProductStructure() -> ProductStructure
#      product.getTransferStatus() -> ProductTransferStatus
#      product.getRootRef() -> ProductRootReference

# for the references returned by product.getProductReferences() the following 
# metadata fields will be added (order will be maintained, such that data store 
# ref at index 0 will map to orig ref at index 0, etc.)
#
#      ProductDataStoreReferences (list of all data store references: 
#       note already translated into path, not URI)
#      ProductOrigReferences (list of all orig references: 
#       note already translated into path, not URI)
#      ProductMimeType (list of all references' mime-types)
#      ProductFileSize (list of all references' file sizes)

org.apache.oodt.cas.filemgr.metadata.expandProduct=false
