<?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="./setupSteps.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.ReroutingResourceResolver</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="./setupSteps.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>
