<?xml version="1.0" encoding="ISO-8859-1" ?>
<!--
    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.

-->
<document>
    <section name="Navigation Top">
        <a href="./setup_steps.html">&lt;&lt;Back to the appendix: Setup steps</a>
        or
        <a href="./exampleconfig.html">On to the appendix: Example Configuration&gt;&gt;</a>
    </section>

    <section name="Appendix: Configuration Entries">
        <subsection name="General Information">
            <p>
                This page is a general quick overview over the possible configuration parameters, if you need further
                details please visit the<a href="./installation.html">setup guide</a>.
            </p>
        </subsection>
        <table>
            <thead>
                <tr>
                    <td>Param</td>
                    <td>Required</td>
                    <td>Possible values</td>
                    <td>Short Description</td>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>org.apache.myfaces.FACES_INIT_PLUGINS</td>
                    <td>YES</td>
                    <td>org.apache.myfaces.extensions.scripting.servlet.StartupServletContextPluginChainLoader</td>
                    <td>MyFaces Extension Point Setup</td>
                </tr>

                <tr>
                    <td>org.apache.myfaces.extensions.scripting.groovy.LOADER_PATHS</td>
                    <td>NO</td>
                    <td>comma separate list of paths</td>
                    <td>Additional comma separated loader paths to allow direct editing of groovy files on the sources
                        directory instead of editing in the deployment dir /WEB-INF/groovy
                    </td>
                </tr>
                <tr>
                    <td>org.apache.myfaces.extensions.scripting.scala.LOADER_PATHS</td>
                    <td>NO</td>
                    <td>comma separate list of paths</td>
                    <td>Additional comma separated loader paths to allow direct editing of scala files on the sources
                        directory instead of editing in the deployment dir /WEB-INF/scala
                        <b>Note this functionality is enabled only in ext-script 1.0.3 or newer</b>
                    </td>
                </tr>
                <tr>
                    <td>org.apache.myfaces.extensions.scripting.java.LOADER_PATHS</td>
                    <td>NO</td>
                    <td>comma separate list of paths</td>
                    <td>Additional comma separated loader paths to allow direct editing of java files on the sources
                        directory instead of editing in the deployment dir /WEB-INF/java
                    </td>
                </tr>
                <tr>
                    <td>org.apache.myfaces.extensions.scripting.resource.LOADER_PATHS</td>
                    <td>NO</td>
                    <td>comma separate list of paths</td>
                    <td>Additional comma separated loader paths to allow direct editing of resources on the sources
                        directory instead of editing in the deployment directory
                    </td>
                    <td>Important notice, in most cases this path will point to the root of your web application
                        directory
                        (ie: src/main/webapp in a standard Maven2 structure or &lt;project-root&gt;/webapp for a
                        standard
                        Eclipse project structure)
                    </td>
                </tr>
                <tr>
                    <td>facelets.RESOURCE_RESOLVER</td>
                    <td>NO</td>
                    <td>org.apache.myfaces.extensions.scripting.jsf.facelet.MyFacesReroutingResourceResolver</td>
                    <td>Enables the loading of xhtml facelet pages from your source directory, if
                        org.apache.myfaces.extensions.scripting.resource.LOADER_PATHS is set properly
                    </td>
                </tr>
                <tr>
                    <td>org.apache.myfaces.scripting.PGK_WHITELIST</td>
                    <td>NO</td>
                    <td>a comma separate list of whitelisted packages</td>
                    <td>Enables package whitelisting, a mechanism which allows to compile and reload only from
                        whitelisted packages. This can help in case of having to reroute ext-scripting to
                        your compile source directories. With this option you can isolate your own dynamic classes
                        from the rest of the system.
                    </td>
                </tr>
                <tr>
                    <td>org.apache.myfaces.extensions.scripting.PGK_ADDITIONAL_CLASSPATH</td>
                    <td>NO</td>
                    <td>a comma separate list of additional classpaths</td>
                    <td>enables additional classpaths for the compile time</td>
                </tr>
            </tbody>
        </table>






    </section>

    <section name="Normal configuration entries">
        <p>all configuration follow the context parameter convention</p>
         <source><![CDATA[
            <context-param>
                <description>
                    Initializes the plugins for our scripting support
                </description>
                <param-name>org.apache.myfaces.FACES_INIT_PLUGINS</param-name>
                <param-value>org.apache.myfaces.extensions.scripting.servlet.StartupServletContextPluginChainLoader</param-value>
            </context-param>
         ]]>
         </source>

    </section>



    <section name="Navigation Bottom">
        <a href="./setup_steps.html">&lt;&lt;Back to the appendix: Setup steps</a>
        or
        <a href="./exampleconfig.html">On to the appendix: Example Configuration&gt;&gt;</a>
    </section>


</document>
