<?xml version="1.0"?>
<document url="./intro.xml">
<!-- 
 * 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.
-->

<properties>
  <author>dev.AT.tomcat.apache.org</author>
  <title>Reusable Dialog Components Tag Library</title>
</properties>

<body>

  <section name="Reusable Dialog Components (RDC)  Tag Library" href="Welcome">

    <p>
        JSP 2.0 Reusable Dialog Components (RDC) is
        a framework for creating JSP taglibs that
        aid in rapid development of voice and multimodal applications. 
    </p>

      <h2>Project Motivation</h2>
<p>
  Server-side generation of HTML has proven an effective way of
  generating the user interface for visual Web applications that
  are implemented using server-side application frameworks such
  as Struts. Over time, the effort involved in such HTML
  generation has been reduced by the availability of various JSP
  tag libraries that abstract away the minutiae of HTML
  markup. The goal of the RDC project is to achieve for voice
  applications what JSP tag libraries have already achieved in
  the world of visual Web applications.</p>
<p>
  The voice application space is seeing rapid growth with the
  maturation of speech technologies along with the arrival of a
  stable and robust voice programming model as defined in the 
  <a href="http://www.w3.org/TR/voicexml20/">W3C VoiceXML 2.0
  REC</a> few years ago.  A necessary next step in mainstreaming the
  development of server-side voice applications within
  environments like Tomcat is the availability of the appropriate
  tag libraries that help isolate the JSP developer from the
  intricacies of spoken interaction.  The goal is to help package
  specialized speech design skills in the form of JSP tag
  libraries that make it possible for JSP developers to easily
  speech-enable Web applications.
</p>
    
    
      <h2>Project Overview</h2>
<p>
  The RDC taglib project provides the following pieces:

<ol>
  <li>A small collection of speech dialog components that aid in basic user interaction.</li>

  <li>An extensible JSP-2.0 framework for implementing additional speech components that can collaborate in producing complex spoken interaction.</li>

  <li> A collection of sample applications that demonstrate the use of these components.</li>
</ol>

All functionality is implemented either directly as JSP 2.0
<i>tag</i> or <i>tagx</i> files, or as Java classes that implement
the equivalent JSP 2.0 tag implementation interfaces.  Dialog
components come with speech grammars authored as
<i>srgs</i> files, a set of default prompts, and the
associated Java beans that implement validation of the data collected by that component.
</p>
<p>The code is under active development, and we are continuing to evolve and enrich the basic framework as we  exercise the presently available functionality by authoring new components and by using these components in real-world voice applications.
</p>
<p>All components in the RDC taglib produce VoiceXML 2.0 that can be served to any VoiceXML 2.0 compliant voice browser.
The generated applications can be deployed to a standard Tomcat server and be accessed by a VoiceXML 2.0 compliant voice browser.
</p>
    
    
      <h2>Requirements</h2>
<p>
This tag library requires JSP 2.0 support and has been developed on Tomcat 5.5.
It depends on the following libraries, many of which can be obtained from various Apache projects:
<ul>
  <li>jstl.jar and standard.jar (JSTL 1.1.2)</li>
  <li>jsp-api.jar (JSP 2.0) for building custom tags</li>
  <li>commons-el.jar (1.0) for delayed EL evaluation</li>
  <li>struts.jar (1.2.9), commons-digester.jar (1.8.1) and
      commons-beanutils.jar (1.8.0) for struts examples and the
      rule-based directed dialog</li>
  <li>commons-logging.jar (1.1.1) for logging in taglib and sample
      applications</li>
  <li>commons-scxml.jar (0.9) needed for the SCXML dialog management
      strategy of the RDC group container</li>
</ul>
It may be possible to use Commons library versions lesser than the ones quoted here.
</p>
<p>
A majority of the tags implemented by this tag library have been
created as <i>.tag</i> files. 
Tag handlers implemented in Java extend JSP 2.0's
<i>SimpleTagSupport</i>.
</p>
    </section>

  <section name="Documentation" href="Documentation">

  <p>For more information about the Reusable Dialog Components (RDC) Tag Library,
    look at the on-line documentation:
  <ul>
  <li>
    View the current release <a href="1.0/index.html">
    RDC 1.0 Taglib Documentation</a>
  </li>
  <li>
    View the development version of the <a href="taglibs-rdc/tlddoc.html">
    RDC Taglib Documentation</a>
  </li>
  </ul>
  </p>

  </section>

  <section name="Download" href="Download">

  <p>Download a binary distribution of the Reusable Dialog
  Components (RDC) Tag Library:
  <ul>
  <li>
    Download the RDC Tag Library 1.0 release from the
    <a href="http://archive.apache.org/dist/jakarta/taglibs/rdc/">
    Apache Archives</a>
  </li>
  </ul>
  </p>

  <p>For information on how to use the distributions in the download section,
    look at the following documentation:
  <ul>
    <li>Using the Apache Taglibs
      <a href="http://tomcat.apache.org/taglibs/site/using.html">
      Binary Distribution</a>
    </li>
    <li>Using the Apache Taglibs
      <a href="http://tomcat.apache.org/taglibs/site/building.html">
      Source Distribution</a>
    </li>
  </ul>
  </p>

  </section>

  <section name="RDC News" href="News">

    <ul>
      <li><b>01/12/2009</b>
        The build has been moved to Maven2.
      </li>
      <li><b>08/01/2006</b>
        The SCXML code has been refactored as a generic engine into its own
        sub-project <a href="http://commons.apache.org/scxml/">Commons
        SCXML</a>. The RDC taglib has a new dependency of Commons SCXML.
      </li>
      <li><b>07/29/2005</b>
        The RDC tag library has provided an alpha version of an SCXML engine, and a 
        SCXML dialog management strategy for the RDC group container.
      </li>
      <li><b>07/20/2005</b>
        The RDC tag library has graduated out of Taglibs sandbox with a 1.0 release.
      </li>
      <li><b>04/25/2005</b>
        Internationalization support has been added to all component tags.
      </li>
      <li><b>02/25/2005</b>
        The Music Store sample application is now multi-channel (Speech + small device GUI)!
      </li>
      <li><b>02/12/2005</b>
        Check out the RDC based Music Store sample application (uses Amazon Web Services)!
      </li>
      <li><b>01/24/2005</b>
        Check out the new features in the RDC pre beta release!
      </li>
      <li><b>09/10/2004</b>
        Check out the new Reusable Dialog Components (RDC) taglib!
      </li>
    </ul>

  </section>

  <section name="Contributors" href="Contributors">

    <p>List of contributors:</p>

    <ul>
      <li>Rahul Akolkar</li>
    </ul>

  </section>

  </body>

</document>
