<?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.javaloader.test.TestResourceHandler</resource-handler>


    </application>
</faces-config>