# Licensed to the Apache Software Foundation (ASF) under one or more
#  contributor license agreements.  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.  For additional information regarding
# copyright in this work, please see the NOTICE file in the top level
# directory of this distribution.

# specify resource loaders to use
resource.loader = webapp, theme, roller, class

# theme resource loader
theme.resource.loader.public.name=theme
theme.resource.loader.description=Roller Theme Resource Loader
theme.resource.loader.class=org.apache.roller.weblogger.ui.rendering.velocity.ThemeResourceLoader
theme.resource.loader.cache=false
theme.resource.loader.modificationCheckInterval=60

# for the loader we call 'roller', use the RollerResourceLoader
roller.resource.loader.public.name=roller
roller.resource.loader.description=Roller Main Resource Loader
roller.resource.loader.class=org.apache.roller.weblogger.ui.rendering.velocity.RollerResourceLoader
roller.resource.loader.cache=false
roller.resource.loader.modificationCheckInterval=60

# for the loader we call 'class', use the ClasspathResourceLoader
class.resource.loader.description = Velocity Classpath Resource Loader
class.resource.loader.class = org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
class.resource.loader.cache=true
class.resource.loader.modificationCheckInterval=60

# for the loader we call 'webapp', use the WebappResourceLoader
webapp.resource.loader.description=Webapp Resource Loader
webapp.resource.loader.class=org.apache.roller.weblogger.ui.rendering.velocity.WebappResourceLoader
webapp.resource.loader.cache=true
webapp.resource.loader.path=/WEB-INF/velocity,/WEB-INF/velocity/templates,/WEB-INF/velocity/templates/feeds,templates/weblog,templates/planet
webapp.resource.loader.modificationCheckInterval=60

# log invalid template references?
# set this to false to have a quieter velocity.log
runtime.log.invalid.reference=false

# tell Velocity to use Log4J
runtime.log.logsystem.class=org.apache.velocity.runtime.log.SimpleLog4JLogSystem
runtime.log.logsystem.log4j.category=org.apache.velocity

# Override the default global library, set to blank to load no default
velocimacro.library = weblog.vm,feeds.vm,roller-custom.vm

# See RollerVelocity for reloading "webapp.resource.loader.path" files via WebappResourceLoader settings
velocimacro.library.autoreload=false

# Allow Velocimacros to be defined in regular templates
velocimacro.permissions.allow.inline=true

# Allow template authors to define macros in any template
velocimacro.permissions.allow.inline.local.scope=false

# set encoding/charset to UTF-8
input.encoding=UTF-8
output.encoding=UTF-8
default.contentType=text/html; charset=utf-8

runtime.introspector.uberspect=org.apache.velocity.util.introspection.SecureUberspector

