<?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.
-->

<page
    xmlns:cinclude="http://apache.org/cocoon/include/1.0"
>
    <content>
        <p>
            <em>Adapted from Tony Collen's GettingStartedWithFlow page on the Cocoon wiki.</em>
        </p>
        <p>
            In this example, an HTML
            form is shown repeatedly, until the user guesses the correct number.
        </p>
        <p>
            Start the game <a href="../number-guess/startGuessNumber">here</a>.
        </p>

        <h2>The sitemap</h2>
        <p>
            At the sitemap level, Flowscript applications need four things:
            <ul>
                <li>The Flowscript code must be made available to the sitemap</li>
                <li>
                    A <em>map:call function</em> instruction must start
                    the Flowscript function when the "application start"
                    request is received
                </li>
                <li>
                    A pipeline must use <em>map:call continuation</em> to activate
                    continuations when their IDs are received in requests
                </li>
                <li>
                    A "view" pipeline must use the (Flowscript-aware) JXTemplate generator
                    to insert data provided by Flowscript into pages.
                </li>
            </ul>
            The corresponding excerpts of our sitemap are shown below.
        </p>
        <h3>Flowscript declaration</h3>
        <p>Note that this already contains the declaration of the next example's Flowscript.</p>
        <cinclude:include element="xml-code" src="cocoon:/xml-element/flow/sitemap.xmap/flow"/>

        <h3>map:call function</h3>
        <p>
            Here we use variables to allow any Flowscript function to be called, with a simple security
            restriction: the function name must start with the <em>public_</em> prefix.
        </p>
        <p>
            The maxValue parameter is used by our Flowscript <em>public_startGuessNumber</em> function,
            but doesn't hurt if it is passed to other functions (like in the next example).
        </p>
        <cinclude:include element="xml-code" src="cocoon:/xml-element/flow/sitemap.xmap/start"/>

        <h3>map:call continue</h3>
        <p>
            This activates a Flowscript continuation when an URL ending with a continuation ID and the
            <em>.continue</em> suffix is received.
        </p>
        <cinclude:include element="xml-code" src="cocoon:/xml-element/flow/sitemap.xmap/continue"/>

        <h3>View pipeline using JXTemplageGenerator</h3>
        <p>
            To be able to include data provided by Flowscript in our forms and views, we
            use the Flowscript-aware JXTemplateGenerator
        </p>
        <p>Here's the pipeline</p>
        <cinclude:include element="xml-code" src="cocoon:/xml-element/flow/sitemap.xmap/views"/>

        <p>Which uses this resource to convert the page to HTML</p>
        <cinclude:include element="xml-code" src="cocoon:/xml-element/flow/sitemap.xmap/html"/>

        <p>And here's the JXTemplate component declaration</p>
        <cinclude:include element="xml-code" src="cocoon:/xml-element/flow/sitemap.xmap/generators"/>

        <h2>Flowscript code</h2>
        <p>
            Here's the complete Flowscript code that drives the number-guessing game.
            (sorry about the lost indentation, the Slop block, which generates these listings, has been
            improved in the meantime).
        </p>
        <cinclude:include element="flowscript-code" src="cocoon:/text-file/flow/number-guess/guess-number.js"/>

        <h2>JXTemplate view</h2>
        <p>
            The JXTemplateGenerator makes Flowscript variables (like the
            <em>toGuess</em> and <em>hint</em> attributes of the <em>sendPageAndWait</em>
            call above) accessible using a simple substitution syntax.
        </p>
        <p>
            Here's the page definition for our number-guessing form.
            JXTemplate codes like <em>${cocoon.continuation.id}</em>, will by replaced
            by values provided in the Flowscript <em>sendPageAndWait</em> function call.
        </p>
        <cinclude:include element="xml-code" src="cocoon:/xml-element/flow/number-guess/guess.xml/page"/>

        <h2>That's it!</h2>
        <p>
            We have now seen the complete code of our Flowscript application:
            <ul>
                <li>A few sitemap declarations, which will be very similar for other Flowscript-based applications</li>
                <li>A JXTemplate-based view, a "normal" page with some substitution codes</li>
                <li>The Flowscript itself</li>
            </ul>
            We didn't have to write much code to implement this,
            and more importantly <em>all the code that we wrote is application-specific</em>.
            The Cocoon framework provides all the infrastructure.
        </p>

    </content>
</page>
