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