<?xml version="1.0"?>
<!--
 * 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.
-->
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
              version="2.0">


    <!-- managed beans of the simple hello world app -->
    <managed-bean>
        <managed-bean-name>helloWorld</managed-bean-name>
        <managed-bean-class>org.apache.myfaces.blank.HelloWorldController</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>

    <managed-bean>
        <managed-bean-name>testbean</managed-bean-name>
        <managed-bean-class>org.apache.myfaces.groovyloader.test.TestBean</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>

    <managed-bean>
        <managed-bean-name>javatestbean</managed-bean-name>
        <managed-bean-class>org.apache.myfaces.javaloader.test.TestBean2</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>


    <managed-bean>
        <managed-bean-name>javaBlogView</managed-bean-name>
        <managed-bean-class>org.apache.myfaces.javaloader.blog.Blog</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
   <!--
    <managed-bean>
        <managed-bean-name>javaBlogService</managed-bean-name>
        <managed-bean-class>org.apache.myfaces.javaloader.blog.BlogService</managed-bean-class>
        <managed-bean-scope>application</managed-bean-scope>
    </managed-bean>
    -->
    <application>
        <navigation-handler>
            org.apache.myfaces.groovyloader.test.TestNavigationHandler
        </navigation-handler>
    </application>


    <lifecycle>
        <phase-listener>
            org.apache.myfaces.groovyloader.test.TestPhaseListener
        </phase-listener>
    </lifecycle>

    <!-- navigation rules for helloWorld.jsp -->
    <navigation-rule>
        <from-view-id>/helloWorld.*</from-view-id>
        <navigation-case>
            <from-outcome>success</from-outcome>
            <to-view-id>/page2.jsf</to-view-id>
        </navigation-case>
    </navigation-rule>

    <!-- navigation rules for page2.jsp -->
    <navigation-rule>
        <from-view-id>/page2.*</from-view-id>
        <navigation-case>
            <from-outcome>back</from-outcome>
            <to-view-id>/helloWorld.jsf</to-view-id>
        </navigation-case>
    </navigation-rule>

    <validator>
        <validator-id>org.apache.myfaces.groovyloader.test.TestValidator</validator-id>
        <validator-class>org.apache.myfaces.groovyloader.test.TestValidator</validator-class>
    </validator>
    <converter>
        <converter-id>org.apache.myfaces.groovyloader.test.TestConverter</converter-id>
        <converter-class>org.apache.myfaces.groovyloader.test.TestConverter</converter-class>
    </converter>

    <component>
        <component-type>org.apache.myfaces.groovyloader.test.TestComponent</component-type>
        <component-class>org.apache.myfaces.groovyloader.test.TestComponent</component-class>
    </component>

    <render-kit>
        <renderer>
            <component-family>javax.faces.Input</component-family>
            <renderer-type>org.apache.myfaces.groovyloader.test.Test</renderer-type>
            <renderer-class>org.apache.myfaces.groovyloader.test.TestRenderer</renderer-class>
        </renderer>
    </render-kit>
    <application>
        <!-- disable an Ext-Val warning which is triggered falsely by the latest version -->
        <!--
        <system-event-listener>

            <system-event-listener-class>
                org.apache.myfaces.extensions.scripting.startup.SuppressExtValWarningStartupListener
            </system-event-listener-class>

            <system-event-class>javax.faces.event.PostConstructApplicationEvent</system-event-class>
        </system-event-listener>
        -->
        <system-event-listener>
            <system-event-listener-class>org.apache.myfaces.javaloader.eventTest.TestListener
            </system-event-listener-class>
            <system-event-class>javax.faces.event.PreRenderViewEvent</system-event-class>
        </system-event-listener>
        <!--
        <resource-handler>org.apache.myfaces.extensions.scripting.jsf.resources.SourceResourceHandler</resource-handler>
        -->
        <resource-handler>org.apache.myfaces.extensions.scripting.jsf.resources.SourceResourceHandler</resource-handler>
    </application>

    <factory>
        <tag-handler-delegate-factory>
             org.apache.myfaces.extensions.scripting.jsf.facelet.TagHandlerDelegateFactoryImpl
         </tag-handler-delegate-factory>
    </factory>
</faces-config>