<!--
    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.
-->
 
 
#General Information
 As of Ext-Scripting 1.0.6 basic Mojarra support has been implemented.
 For now not the entire spectrum of services Ext-Scripting provides are enabled for Mojarra
 but basic Ext-Scripting works out of the box.
 Following compatibility diagram shows what
 is provided for Mojarra and what is provided for MyFaces.
 ![](images/mojarra-support.jpg)
 Image: Mojarra compatibility
 
#Setup Steps
 The setup is fairly straight forward.
 
 Add the support jars (extscript-mojarra-bundle.jar) and setup your loader paths
 just like you would do it for MyFaces.
 The main difference is setting up the loader paths for Mojarra is mandatory.
 
 The mandatory loader paths are needed to avoid conflicts with Mojarras internal Groovy
 support which utilizes the same paths. (This was a design decision to keep Mojarra compatibility
 at a time Mojarra support was not really under discussion)
 So here is an example configuration for Mojarra:
    <web-app 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-app_3_0.xsd"
             version="3.0">
          <!-- ======================================================================================
                Loader path for Groovy files
             ====================================================================================== -->
        <context-param>
            <description>Additional comma separated loader paths to allow direct editing on the sources directory instead
                of the deployment dir
            </description>
            <param-name>org.apache.myfaces.extensions.scripting.groovy.LOADER_PATHS</param-name>
            <param-value>
                /Users/werpu2/development/workspace/extensions-scripting3/examples/myfaces20-example/src/main/webapp/WEB-INF/groovy
            </param-value>
        </context-param>
        <!-- ======================================================================================
                Optional Loader Paths for Java Source Files
             ====================================================================================== -->
        <context-param>
            <description>Additional comma separated loader paths to allow direct editing on the sources directory instead
                of the deployment dir
            </description>
            <param-name>org.apache.myfaces.extensions.scripting.java.LOADER_PATHS</param-name>
            <param-value>
                /Users/werpu2/development/workspace/extensions-scripting3/examples/myfaces20-example/src/main/webapp/WEB-INF/java
            </param-value>
        </context-param>
        <!-- ======================================================================================
                Loader path for Scala files
             ====================================================================================== -->
        <context-param>
            <description>Additional comma separated loader paths to allow direct editing on the sources directory instead
                of the deployment dir
            </description>
            <param-name>org.apache.myfaces.extensions.scripting.scala.LOADER_PATHS</param-name>
            <param-value>
                /Users/werpu2/development/workspace/extensions-scripting3/examples/myfaces20-example/src/main/webapp/WEB-INF/scala
            </param-value>
        </context-param>
        <!-- ======================================================================================
                Optional Loader Paths for resource files
             ====================================================================================== -->
        <context-param>
            <description>resource paths for our custom JSF2 resource resolver</description>
            <param-name>org.apache.myfaces.extensions.scripting.resources.LOADER_PATHS</param-name>
            <param-value>
                /Users/werpu2/development/workspace/extensions-scripting3/examples/myfaces20-example/src/main/webapp
            </param-value>
        </context-param>
        <!-- ======================================================================================
                Optional: Tell Facelets to load the resources from your source dir
             ====================================================================================== -->
        <context-param>
            <description>a redirecting Facelet resource resolver which allows to pick up templates and resources from our
                source dir
            </description>
            <param-name>facelets.RESOURCE_RESOLVER</param-name>
            <param-value>org.apache.myfaces.extensions.scripting.jsf.facelet.ReroutingResourceResolver</param-value>
        </context-param>
        <!-- ======================================================================================
                Optional: Whitelist of root packages where your sources should come from
             ====================================================================================== -->
        <context-param>
            <description>a comma separated whitelist of root packages which are compiled those and nothing else
                will be compiled during all compile stages, all other files stay permanently as they are
            </description>
            <param-name>org.apache.myfaces.extensions.scripting.PGK_WHITELIST</param-name>
            <param-value>org.apache.myfaces.groovyloader.blog,org.apache.myfaces.javaloader.blog</param-value>
        </context-param>
        <!-- ======================================================================================
                Optional Additional Classpath
             ====================================================================================== -->
        <context-param>
            <description>
                Additional Classpaths which will be added to the compilers classpath
            </description>
            <param-name>org.apache.myfaces.extensions.scripting.PGK_ADDITIONAL_CLASSPATH</param-name>
            <param-value>/usr/lib/java/myjar.jar,/usr/lib/java/myjar2.jar</param-value>
        </context-param>
        ... faces config entries
    </webapp>
                
 
 
