<?xml version="1.0" encoding="UTF-8"?>
<!--
 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.
-->
<!-- ======================================================================== -->
<!--                                                                          -->
<!--  Component Configuration for Avalon Components                           -->
<!--                                                                          -->
<!-- $Id$ -->
<!--                                                                          -->
<!-- ======================================================================== -->

<componentConfig>
    <!-- Torque Component -->
    <torque>
       <configfile>conf/test/TorqueTest.properties</configfile>
    </torque>
    <cache cacheInitialSize="20" cacheCheckFrequency="5"/>
    <mimetype/>
    <crypto>
      <algorithm>
      	<unix>org.apache.fulcrum.crypto.provider.UnixCrypt</unix>
        <clear>org.apache.fulcrum.crypto.provider.ClearCrypt</clear>
        <java>org.apache.fulcrum.crypto.provider.JavaCrypt</java>
        <oldjava>org.apache.fulcrum.crypto.provider.OldJavaCrypt</oldjava>
      </algorithm>
    </crypto>
    <localization>
      <bundles>
        <bundle>org.apache.turbine.services.localization.BarBundle</bundle>
      </bundles>
    </localization>
    <upload repository="target" sizeMax="1048576" sizeThreshold="10240"/>
    <intake>
      <serialDataPath>target/appData.ser</serialDataPath>
      <xmlPaths>
        <xmlPath>conf/test/intake.xml</xmlPath>
      </xmlPaths>
    </intake>
    <factory/>
    <pool/>
    <parser>
        <parameterEncoding>utf-8</parameterEncoding>
        <automaticUpload>true</automaticUpload>
    </parser>

    <!-- These components belong to the Fulcrum-Security services -->
    <securityService/>
    <authenticator/>
    <modelManager/>
    <aclFactory/>
    <userManager>
        <className>org.apache.fulcrum.security.model.turbine.entity.impl.TurbineUserImpl</className>
    </userManager>
    <groupManager>
        <className>org.apache.fulcrum.security.model.turbine.entity.impl.TurbineGroupImpl</className>
    </groupManager>
    <roleManager>
        <className>org.apache.fulcrum.security.model.turbine.entity.impl.TurbineRoleImpl</className>
    </roleManager>
    <permissionManager>
        <className>org.apache.fulcrum.security.model.turbine.entity.impl.TurbinePermissionImpl</className>
    </permissionManager>

</componentConfig>
