<?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 version="1.2"
              xmlns="http://java.sun.com/xml/ns/javaee"
              xmlns:xi="http://www.w3.org/2001/XInclude"
              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_1_2.xsd">

    <!-- 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>blogView</managed-bean-name>
        <managed-bean-class>org.apache.myfaces.groovyloader.blog.Blog</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>

    <managed-bean>
        <managed-bean-name>blogService</managed-bean-name>
        <managed-bean-class>org.apache.myfaces.groovyloader.blog.BlogService</managed-bean-class>
        <managed-bean-scope>application</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>
        <view-handler>com.sun.facelets.FaceletViewHandler</view-handler>

        <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>
   
</faces-config>