<?xml version="1.0"?>
<!-- 
/*
 * Copyright 2001-2004 The Apache Software Foundation.
 * 
 * Licensed 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.
 */
 -->

<document>

 <properties>
  <title>Turbine Services - Velocity Service</title>
 </properties>

<body>

<section name="Velocity Service">

<p>
</p>

</section>

<section name="Configuration">

<source><![CDATA[
# -------------------------------------------------------------------
# 
#  S E R V I C E S
#
# -------------------------------------------------------------------
# Classes for Turbine Services should be defined here.
# Format: services.[name].classname=[implementing class]
#
# To specify properties of a service use the following syntax:
# service.[name].[property]=[value]

services.VelocityService.classname = org.apache.turbine.services.velocity.TurbineVelocityService
.
.
.
# -------------------------------------------------------------------
# 
#  V E L O C I T Y  S E R V I C E
#
# -------------------------------------------------------------------

# The location of Velocity configuration file, relative to webapp root
# These properties will override the default properties set by Velocity.
# You should specify the path to the templates directories as well as 
# the path to the log file and they should also be relative to webapp root

services.VelocityService.template.extension = vm
services.VelocityService.default.page = VelocityPage
services.VelocityService.default.screen = VelocityScreen
services.VelocityService.default.layout = VelocityECSLayout
services.VelocityService.default.navigation = VelocityNavigation
services.VelocityService.default.error.screen = VelocityErrorScreen
services.VelocityService.default.layout.template = Default.vm

#
# Set this to true to catch Velocity Errors and display them in the log file
services.VelocityService.catch.errors = true

services.VelocityService.runtime.log = /logs/velocity.log
#services.VelocityService.input.encoding = UTF-8
services.VelocityService.velocimacro.library = GlobalMacros.vm

services.VelocityService.resource.loader = file
services.VelocityService.file.resource.loader.description = Velocity File Resource Loader
services.VelocityService.file.resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoader
services.VelocityService.file.resource.loader.path = /templates/app
services.VelocityService.file.resource.loader.cache = false
services.VelocityService.file.resource.loader.modificationCheckInterval = 2

services.VelocityService.resource.loader = classpath
services.VelocityService.classpath.resource.loader.description = Velocity Classpath Resource Loader
services.VelocityService.classpath.resource.loader.class = org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader

]]></source>

</section>

<section name="Usage">

</section>

<section name="Properties">
<ul>
  <li>"services.VelocityService.catch.errors" controls the reporting of Velocity errors to the application (and to to the user).
      If this is set to "true" (which is the default), errors are caught by Turbine and reported in the turbine.log file at 
      error level. Velocity will get the String "[Turbine caught an Error here. Look into the turbine.log for further information]"
      as return value (this might cause further errors down the road if you e.g. expect a numerical value or an object as the result
      of a method), so if you see this message in your screen, follow the instructions.
  </li>
</ul>
</section>

</body>
</document>
