<?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>
    <properties>
        <title>Users Guide</title>
    </properties>

    <body>
        <section name="Navigation Top">
            <a href="./installation.html">&lt;&lt;Back to the Setup Guide</a> or
            <a href="./usingGeneral.html">On to the General Users Guide&gt;&gt;</a>
        </section>


        <section name="Users Guide">
            <p>
                After having set up MyFaces Ext-Scripting (if you do not have done so please go to our<a
                    href="./installation.html">Installation Page</a>), you basically can start editing, and be done with
                the users
                guide.
            </p>
            <p>
                Well theoretically anyway, there are some things every user of Extension-Scripting has to take into
                consideration.
            </p>
            <p>
                First of all Ext-Scripting in its current incarnation tries to help the programmers every day life. That
                means, it tries to reduce the number of needed server restarts to the lowest possible minimum which is
                achievable within the boundaries of Java and JSF.
                Also it is not yet fully integrated into the bigger application servers, testing only currently is
                done for Apache Tomcat and Jetty. Scala due to the nature of its compiler interface, definitely only
                will work in an expanded embedded WAR environment, not in an EAR environment.
            </p>
            <p>
                You won't get a zero restart configuration, Extension-Scripting tries not to be perfect in this regard,
                but
                what you can achieve is a significant reduction on restarts by applying scripting languages and dynamic
                compilation.
            </p>
            <p>
                Secondly, we do not try to support every scripting language under the earth, the basic goal is first to
                get
                the basics right and then in subsequent releases to add additional scripting languages support.
            </p>
            <p>
                As is, every scripting language which can compile against the JVM can be supported. Purely interpreted
                languages are not supported.
            </p>
            <p>
                For now we cannot recommend to use Ext-Scripting in a production environment for live patches, although
                it
                theoretically would be possible, and we spent a lot of blood sweat and tears into making the system
                stable
                under multithreaded conditions. For now, however, we simply only can recommend to use Ext-Scripting for
                development and development only scenarios if you need to hot patch code (deployment without any changes
                however should be fine). So if you want to hot patch a running installations, we assume it should work
                fine,
                but you are on your own.
            </p>
        </section>
        <section name="Chapters">
            <p>The Following Chapters should help you to guide you through the usage of Ext-Scripting</p>
            <ul>
                <li>
                    <a href="./usingGeneral.html">General users guide</a>
                </li>
                <li>
                    <a href="./usingAdvanced.html">Advanced usage</a>
                </li>
                <li>
                    <a href="./usingEclipse.html">Ext-Scripting in Eclipse</a>
                </li>
                <li>
                    <a href="./usingIntellij.html">Ext-Scripting in Intellij</a>
                </li>
                <li>
                    <a href="./usingNetbeans.html">Ext-Scripting in Netbeans</a>
                </li>
            </ul>
        </section>

        <section name="Navigation Bottom">
            <a href="./installation.html">&lt;&lt;Back to the Setup Guide</a>  or

            <a href="./usingGeneral.html">On to the General Users Guide&gt;&gt;</a>
        </section>

    </body>
</document>
        