<?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.
*#
<componentConfig>
    <!-- Torque Component -->
    <torque>
       <configfile>/WEB-INF/conf/Torque.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>${package}.L10N</bundle>
      </bundles>
    </localization>
    <!-- Disable if you experience startup problems with Java8 -->
    <intake>
      <serialDataPath>WEB-INF/appData.ser</serialDataPath>
      <xmlPaths>
        <xmlPath>WEB-INF/conf/${turbine_intake_file}</xmlPath>
      </xmlPaths>
    </intake>
    <factory/>
    <pool/>
    <parser>
        <parameterEncoding>utf-8</parameterEncoding>
        <automaticUpload>true</automaticUpload>
    </parser>
    <upload repository="/tmp" sizeMax="1048576" sizeThreshold="10240"/>
        <!-- These components belong to the Fulcrum-Security services -->        
    <securityService/>
    <authenticator/>
    <modelManager/>
    <aclFactory/>
    
    <!--  
       Fulcrum Components, e.g. json, XmlRpcServerComponent, cft. Fulcrum Component Configurations 
     -->
       
     
     <!--  
     Pure Fulcrum Model
    -->
    <!--
     <userManager> 
       <className>org.apache.fulcrum.security.torque.om.TorqueTurbineUser</className>
    </userManager>
    <groupManager>
        <className>org.apache.fulcrum.security.torque.om.TorqueTurbineGroup</className>
    </groupManager>
    <roleManager>
        <className>org.apache.fulcrum.security.torque.om.TorqueTurbineRole</className>
    </roleManager>
    <permissionManager>
        <className>org.apache.fulcrum.security.torque.om.TorqueTurbinePermission</className>
    </permissionManager>
    -->
 
     <!-- 
     Default classes implementing org.apache.fulcrum.security.model.turbine.entity interfaces 
     -->
    <!--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 -->
    
    <!-- 
     Custom Turbine ORM Torque classes could not yet be used: 
     - requires Torque 4.1 or if using Torque 4.0 reqires manually adding the interfaces in T-classes
     - requires attribute baseClass in fulcrum-turbine-schema.xml table elements set to appropriate org.apache.fulcrum.security.model.turbine.entity interfaces
     - requires attribute peerClass in fulcrum-turbine-schema.xml table elements set to org.apache.fulcrum.security.torque.peer.TorqueTurbinePeer 
     -->
     
     <userManager>
     <className>${package}.om.TurbineUser</className>
        <peerClassName>${package}.om.TurbineUserPeerImpl</peerClassName>
    </userManager>
    <groupManager>
        <className>${package}.om.TurbineGroup</className>
        <peerClassName>${package}.om.TurbineGroupPeerImpl</peerClassName>
    </groupManager>
    <roleManager>
        <className>${package}.om.TurbineRole</className>
        <peerClassName>${package}.om.TurbineRolePeerImpl</peerClassName>
    </roleManager>
    <permissionManager>
        <className>${package}.om.TurbinePermission</className>
        <peerClassName>${package}.om.TurbinePermissionPeerImpl</peerClassName>
    </permissionManager>
     <peerManager/>
     
</componentConfig>