W3C

CCXML 1.0 Implementation Report

Version: 12 April 2011

Contributors:

RJ Auburn, Voxeo
Paolo Baggia, Loquendo (Chief Editor)
Marina Berati, Loquendo
Serguei Golberg, Voxeo
Rob Green, Voxeo
Fenton Har, Genesys
Matthew Prast, Voxeo
Laura Ricotti, Loquendo

Table of Contents

1. Introduction

The CCXML 1.0 Specification entered the Candidate Recommendation period on 1 April 2010.

Preparation of an Implementation Report is a key criterion for moving beyond the Candidate Recommendation phase. This document describes the requirements for the Implementation Report and the process that the Voice Browser Working Group will follow in preparing the report.

The revised target date for entering Proposed Recommendation is 3 August 2010. The group will advance CCXML 1.0 to Proposed Recommendation no sooner than 3 August 2010.

Note: This Implementation Report was modified based on the public comments. See Appendix E for the detail of the changes.

1.1 Implementation Report Objectives

  1. Must verify that the specification is implementable.
  2. Must demonstrate interoperability of implementations of the specification.

1.2 Implementation Report Non-objectives

  1. The IR does not attempt conformance testing of implementations.

2. Work During the Candidate Recommendation Period

During the CR period, the Working Group will carry out the following activities:

  1. Clarification and improvement of the exposition of the specification.
  2. Disposing of Comments that were communicated to the WG during the CR period.
  3. Preparation of an Implementation Report meeting the criteria outlined in this document.

3. Participating in the Implementation Report

You are invited to contribute to the assessment of the W3C CCXML 1.0 Specification by participating in the Implementation Report process.

4. Entrance Criteria for the Proposed Recommendation Phase

The Voice Browser Working Group established the following entrance criteria for the Proposed Recommendation phase in the Request for CR:

  1. Sufficient reports of implementation experience have been gathered to demonstrate that CCXML processors based on the specification are implementable and have compatible behavior.
  2. Specific Implementation Report Requirements (outlined below) have been met.
  3. The Working Group has formally addressed and responded to all public comments received by the Working Group.

5. Implementation Report Requirements

5.1 Detailed requirements for Implementation Report

  1. Testimonials from implementers will be included in the IR when provided to document the utility and implementability of the specification.
  2. IR must cover all specified features in the specification. For each feature the IR should indicate:
  3. Feature status is a factor in test coverage in the report:

5.2 CCXML Processor Coverage

Require implementations and testimonial statements for at least two CCXML platforms.

5.3 Notes on Testing

  1. A test report must indicate the outcome of each test assertion. Possible outcomes are "pass", "fail" or "not-impl". "pass" requires output of the CCXML processor that is equivalent to the output specified in the respective test file. A report must document the way test output was verified. "not-impl" means the CCXML processor has not implemented the specific feature required by a test.
  2. A test report may contain an additional comment for each test. If a test fails, a comment should be added (see also Detailed requirements for Implementation Report).
  3. Every attempt has been made to keep the tests language-neutral through the use of the Test API described in Appendix A and Appendix B.
  4. Each test is a Jumbo test as described in Appendix A.3, which tests several test assertions in a single test.
  5. Some tests contain notes that should be read before executing them. These notes can be found in comments contained within the main test document and preceding the test code.

5.4 Out of Scope

  1. IR will not cover CCXML processor performance.
  2. IR will not cover VoiceXML processor recognition performance.
  3. IR will not validate that a completely conformant ECMA script implementation has been done.

6. Systems

Interact Incorporated SPOT SIP Engine

Executive Summary

Interact Inc. Software Systems, a privately held company in the IVR space for more than 20 years, delivered our first W3C standards based product in 2004. Our first implementation of CCXML was based on the 29 Jun 2005 Working Draft, which we have subsequently used in conjunction with our high performance SPOT SIP Engine and VIP line of IVR products. We have waited patiently since then for a Candidate Recommendation, since that draft and subsequent drafts left many open questions. With the W3C CCXML 1.0 Candidate Recommendation, we now have a more complete and quite well documented interface to call control, switching, and conferencing. Interact Incorporated is proud to submit our Implementation Report. As a company not part of the W3C, and therefore not part of the specification development process, our report represents an outsider viewpoint of its feasibility and usefulness.

Loquendo VoxNauta CCXML Interpreter

Executive Summary

As a leading player in the speech technologies and voice platform markets, Loquendo believes that the CCXML 1.0 Specification increases the possibilities for the development of a wide range of voice applications by simplifying and enhancing call control management. The availability of the CCXML standard completes the tremendous leap forward made by VoiceXML, and in general the Speech Interface Framework developed by the W3C Voice Browser working group, allowing a clear separation between service and control layers. CCXML 1.0 will further promote the creation of efficient and powerful voice applications and it will hopefully further boost the IVR market and speech market in general.

Loquendo is delighted to contribute by submitting the CCXML 1.0 Implementation Report, which clearly demonstrates the effectiveness of the CCXML specification. Loquendo will continue to strongly support the activities of the W3C Voice Browser and Multimodal Interaction as part of its commitment to actively contributing to the evolution of their standards.

OptimTalk CCXML interpreter

Executive Summary

OptimSys provides software technologies, products and services in the area of telephony, call centers, IVR systems and speech-enabled systems in general. The company specializes in VoiceXML, CCXML and advanced speech technologies.

We are strongly convinced that the CCXML specification plays an irreplaceable role in creation of value added services for telephony, going far beyond the traditional telecom and call center market segments.

Besides these areas, OptimSys also uses CCXML, in combination with VoiceXML, for integration of telephony with business processes and corporate IT systems, or for building advanced communication systems featuring automation for dispatch terminals.

The CCXML interpreter became an important part of OptimSys' OptimTalk platform. Our first implementation was based on the April 30, 2004 Working Draft and since then OptimSys continuously contributes to the CCXML specification development as an external contributor. We are happy to see it becoming mature.

This report contains final CCXML Implementation results for OptimTalk CCXML interpreter. It demonstrates the implementability and interoperability of CCXML 1.0 specification.

Voxeo Prophecy 10.2

Executive Summary

Voxeo is pleased to be able to announce 100% support for the W3C Call Control XML (CCXML) 1.0 specification. As the company that delivered the world first and now the the worlds most compliant CCXML platform we are happy to announce our continued support and commitment to the CCXML specification. Our CCXML implementation is used by over 200,000 companies to power billions of phone calls per year as part of our worldwide hosting network and our on-premise platform. For more information about our platform please visit our web site at www.voxeo.com.

7. Test Results

The following table lists all the assertions that were derived from the CCXML 1.0 Specification.

The Assert ID column uniquely identifies the assertion, which is linked to the start test. Note that some test assertions are tested in depending documents.

The Spec column identifies the section of the CCXML 1.0 Specification from which the assertion was derived.

The Conformance column indicates whether or not the CCXML 1.0 Specification requires the CCXML processor to implement the feature described by the test assertion.

The Test Type column indicates whether or not the associated test requires an adaptation to the testing environment. If the test assertion is considered manual, then the notes of the associated test gives more details about how the test must be modified (see Appendix A.1).

License

This test suite is licensed under both the W3C Test Suite License and the W3C 3-clause BSD License. See W3C Legal's explanation of the licenses.

ID Spec Conformance Test Type Abstract Results
PassFailN/I
599 [6.1] Required Auto A CCXML session can consist of multiple CCXML documents, traversed by use of <goto> and <fetch>. 400
605 [6.2.1] Required Auto When a <ccxml> is executed, its child elements are collected logically together at the beginning of the document and executed in document order before the target <eventprocessor>. 400
606 [6.2.1] Required Auto The <ccxml> can designate the CCXML namespace. This can be achieved by declaring an xmlns attribute or an attribute with an " xmlns " prefix. 400
607 [6.2.1] Required Auto Note that when the xmlns attribute is used alone, it sets the default namespace for the element on which it appears and for any child elements. 400
608 [6.2.1] Required Auto The namespace URI for CCXML is "http://www.w3.org/2002/09/ccxml". 400
609 [6.2.1] Required Auto The <ccxml> element must contain a version attribute. The initial version number is 1.0. 400
610 [6.2.1] Required Auto The <ccxml> element may contain a xml:base attribute. This is the URI which all relative references within the document take as their base. 400
611 [6.2.2] Required Auto A CCXML document may contain a <meta> element. 400
612 [6.2.2] Required Auto A <meta> element may contain a name attribute indicating the name of the metadata information 400
615 [6.2.2] Required Auto Either a name or http-equiv attribute is REQUIRED. 400
617 [6.2.2] Required Auto A <meta> element must contain a content attribute. If not specified, error.fetch event will be thrown. 400
619 [6.2.3] Required Auto A CCXML document may contain a <metadata> element. <metadata> is a container in which information about the document can be placed using a metadata language. 400
622 [6.2.3] Required Auto <metadata> may not specify any attributes. If attributes are specified, an error.fetch event is thrown 400
623 [6.2.4] Required Auto A CCXML document may contain an <if> element. An <if> is a container for conditionally executed elements 400
624 [6.2.4] Required Auto <else> and <elseif> can optionally appear within an <if> as immediate children 400
625 [6.2.4] Required Auto If an <if> has no immediate <elseif> or <else> children, the full contents of the <if> will be selected when the cond attribute is true 400
626 [6.2.4] Required Auto A CCXML <if> element must contain a cond attribute. If not provided, an error.fetch event is thrown. 400
627 [6.2.5] Required Auto An <elseif> partitions the content of an <if>, and provides a condition that determines the selection of the partition it begins 400
628 [6.2.5] Required Auto A CCXML <elseif> element must contain a cond atribute.If a cond atribute is not provided for an <elseif>, error.fetch event is thrown. 400
629 [6.2.6] Required Auto <else> is a synonym for <elseif cond="true"/>. 400
1001 [6.2.7] Required Auto The <fetch> method attribute may be have a value set to "get" 400
1002 [6.2.7] Required Auto The <fetch> method attribute may have a value set to "post" 400
1298 [6.2.7] Required Auto In fetch tag, if mode attribute is set to processed (the default) the CCXML platform MUST attempt to parse and validate the returned content. 400
1299 [6.2.7] Required Auto In fetch tag, if mode attribute is set to raw the platform MUST NOT attempt to process the data and MUST leave processing of the content to the application who can do what it wishes with the content via the content attribute of the fetch.done event. 400
630 [6.2.7] Required Auto <fetch> is used to asynchronously fetch content identified by the attributes of the <fetch> 400
631 [6.2.7] Required Auto The fetched content may either be a CCXML document, or script content. 400
632 [6.2.7] Required Auto Execution returns from the element immediately, and the CCXML application can continue on while the platform works to fetch the identified resource. 400
633 [6.2.7] Required Auto When the fetch request has been completed, a fetch.done event is thrown to indicates that the identified content was fetched successfully 400
634 [6.2.7] Required Auto When the fetch request has been completed, a error.fetch event is thrown to indicate a failure to fetch the requested content 400
635 [6.2.7] Required Auto If content is successfully fetched, errors in processing fetched content (for instance, a CCXML document with a syntax error) may result in an error.fetch being thrown. 400
636 [6.2.7] Required Auto The application may obtain the unique identifier for a fetch request by providing an ECMAScript left-hand-side expression in the fetchid attribute when the fetch is performed 400
637 [6.2.7] Required Auto The fetch identifier can be obtained as a property of the fetch.done event. 400
638 [6.2.7] Required Auto Fetched content has a lifetime that is limited to that of the document in which it is fetched. Therefore, following a transition to a new CCXML document using <goto>, content fetched in the scope of the current document is no longer accessible. 400
640 [6.2.7] Required Auto A CCXML <fetch> element may contain a type attribute. 400
641 [6.2.7] Required Auto If a type attribute is not provided the default value is: In processed mode "application/ccxml+xml". In raw mode "*/*". 400
642 [6.2.7] Required Auto A CCXML <fetch> element may contain a namelist attribute. The namelist content will be submitted to the server where the URL is located. 400
643 [6.2.7] Required Auto A CCXML <fetch> element may contain a method attribute specifying the HTTP method to use. 400
645 [6.2.7] Required Auto A CCXML <fetch> element may contain a fetchid attribute. 400
646 [6.2.7] Required Auto A CCXML <fetch> element may contain a timeout attribute. The fetch will fail if not completed at the end of this interval. A failed fetch will return the error.fetch event. 400
650 [6.2.7] Required Auto A CCXML <fetch> element may contain an enctype attribute indicating the media encoding type of the submitted document. If an enctype is specified, the value must be: application/x-www-form-urlencoded. 400
995 [6.2.7] Required Auto Content that has been acquired using <fetch> is accessible through other elements defined by CCXML 400
996 [6.2.7] Required Auto The "http" URI scheme MUST be supported by CCXML platforms 400
651 [6.2.8] Required Auto A <goto> transfers control to the document obtained through a fetch request, using the platform-generated unique identifier associated with that fetch request. 400
652 [6.2.8] Required Auto The fetch completion event MUST have arrived before the <goto> is executed, otherwise, an error.semantic event is generated. 400
653 [6.2.8] Required Auto If the fetched content referenced by the fetch identifier is not a CCXML document, or the fetch identifier is invalid and does not correspond to any fetch request, this also results in an error.semantic event. 400
654 [6.2.8] Required Auto When a <goto> is executed, the target document replaces the current document in its session. 400
655 [6.2.8] Required Auto Event sources associated with this session are inherited by the target document 400
656 [6.2.8] Required Auto Execution of the current document terminates when a <goto> element is executed 400
657 [6.2.8] Required Auto A CCXML <goto> element must contain a fetchid attribute. If the fetchid attribute is not provided and error.fetch event is thrown. 400
1160 [6.2.9] Required Auto If the value of the fetchparam attribute is 'none', then no additional parameters may be passed with the fetch. 400
1161 [6.2.9] Required Auto If the value of the fetch param attribute is 'session.id', then the 'session.id' property of the newly created session must be included when fetching the initial document 400
1162 [6.2.9] Required Auto If the value of the fetchparam attribute is 'session', then the 'session.id' property and all properties of 'session.values' will be included when fetching the initial document. 400
1163 [6.2.9] Required Auto A parameters attribute may be specified. If specified, the parameters attribute is a list of zero or more whitespace separated CCXML variable names. Each named variable will be created as a property of 'session.values' in the newly created session. 400
658 [6.2.9] Required Auto <createccxml> is used to create another CCXML session, which begins execution with the document identified by this element. 400
661 [6.2.9] Required Auto The new CCXML session has no relation to its creator once spawned, and has a wholly separate lifetime and address space. 400
662 [6.2.9] Required Auto Execution returns from the <createccxml> element immediately, and the CCXML interpreter can continue on while the new CCXML session is established and loads its initial document. 400
665 [6.2.9] Required Auto The next attribute is required. It is an ECMAScript expression which returns the URI of the resource to be fetched 400
666 [6.2.9] Required Auto The namelist attribute is optional. A list of zero or more whitespace separated CCXML variable names. These variables must be submitted to the server, with the same qualification as used in the namelist. When an ECMAscript variable is submitted to the server, its value must be first converted into a string before being submitted. 400
667 [6.2.9] Required Auto The method attribute is optional. It is An ECMAScript expression which returns a character string that indicates the HTTP method to use. 400
669 [6.2.9] Required Auto The sessionid attribute is optional. It is an ECMAScript left hand side expression evaluating to a previously defined variable. The value of the attribute must receive an internally generated unique string identifier which identifies the newly created session. 400
670 [6.2.9] Required Auto The timeout attribute is optional. It is an ECMAScript expression. The character string returned must be interpreted as a time interval. This time interval must be interpreted by the new CCXML session as the maximum time it may wait for the completion of the fetch for the initial document specified by the next attribute. If the new CCXML session is unable to fetch the initial document within the timeout interval, an error.createccxml event must be thrown. 400
671 [6.2.9] Required Auto The maxage attribute is optional. It is an ECMAScript expression. The character string returned must be interpreted as a time interval. This indicates that the document is willing to use content whose age must be no greater than the specified time in seconds (cf. 'max-age' in HTTP 1.1 [RFC2616]). The document is not willing to use stale content, unless maxstale is also provided. 400
673 [6.2.9] Required Auto The maxstale attribute is optional. It is an ECMAScript expression. The character string returned must be interpreted as a time interval. This indicates that the document is willing to use content that has exceeded its expiration time (cf. 'max-age' in HTTP 1.1 [RFC2616]). If maxstale is assigned a value, then the document is willing to accept content that has exceeded its expiration time by no more than the specified number of seconds. 400
674 [6.2.9] Required Auto The enctype attribute is optional. It is an ECMAScript expression which returns a character string that indicates the media encoding type of the submitted document (when the value of the method is "post"). Values defined by the specification are: application/x-www-form-urlencoded. (Only one enctype is defined.) 400
675 [6.2.10] Required Auto <exit> ends execution of the CCXML session. All pending events are discarded, and there is no way to restart CCXML execution. 400
684 [6.2.11] Required Auto The <log> element may have a label attribute to indicate the purpose of the log. 400
685 [6.2.11] Required Auto The <log> element must provide an expr attribute evaluating to string to be logged 400
686 [6.2.11] Required Auto If an expr attribute is not provided, an error.fetch event will be thrown. 400
689 [6.3.2] Required Auto A fetch.done event will contain a fetchid property set to the internally generated unique fetch identifier 400
690 [6.3.2] Required Auto A fetch.done event will contain a uri property set to the URI of the fetch request. 400
1006 [6.3.3] Required Auto An error.fetch event will contain a statuscode property set to the numeric HTTP status code of the failed HTTP request 400
693 [6.3.3] Required Auto An error.fetch event will contain a fetchid property set to the internally generated unique fetch identifier 400
694 [6.3.3] Required Auto An error.fetch event will contain a reason property set to a string describing the fetch error. 400
695 [6.3.3] Required Auto An error.fetch event will contain a uri property set to the URI of the fetch request. 400
1014 [6.3.4] Required Auto A ccxml.exit event will contain a reason property set to the reason the session ended. Possible values are: "exit" - Session ended due to a <exit> element, "error" - Session ended due to an unhandled error event, "kill" - Session ended due to ccxml.kill* event 400
1164 [6.3.4] Required Auto This event is generated when a CCXML document has an unhandled "error.*" event 400
1165 [6.3.4] Required Auto This event is generated when a CCXML document has an unhandled ccxml.kill event. 400
1166 [6.3.4] Required Auto The ccxml.exit event is only generated when the session exiting has a parent session. This event is sent to the parent session and not the exiting. 400
698 [6.3.4] Required Auto A ccxml.exit event will contain a sessionid property set to the identifier of the exiting session. This is the same value returned to the sessionid attribute of the <createccxml> which created this session 400
699 [6.3.4] Required Auto A ccxml.exit event will contain a expr property containing the value of the value of the <exit> expr attribute 400
701 [6.3.4] Required Auto A ccxml.exit event will contain a values object with sub properties for each entry in the namelist attribute. 400
702 [6.3.5] Required Auto The ccxml.loaded event is thrown once the document is parsed and ready for execution (document initialization occurs between the fetched and loaded events). 400
703 [6.3.5] Required Auto The CCXML platform MUST generate this event when the CCXML document is first loaded at session startup. 400
704 [6.3.5] Required Auto The CCXML platform MUST generate this event when the CCXML document is loaded after transferring control to a new document with the <goto>. 400
705 [6.3.5] Required Auto This event would be processed after the platform had executed the document initialization including executing any elements under the <ccxml> 400
707 [6.3.5] Required Auto The ccxml.loaded event contains a sessionid property that identifies of the session on which this document is executing 400
708 [6.3.5] Required Auto The ccxml.loaded event contains a parent property indicating the identifier of the session which issued the <createccxml> to start this document. 400
709 [6.3.5] Required Auto if this document was started directly by the CCXML platform, the parent property of a ccxml.loaded event is set to ECMAScript undefined 400
710 [6.3.6] Required Auto The ccxml.kill event can be used by the platform to terminate a session without an explicit <exit>. 400
711 [6.3.6] Required Auto The ccxml.kill event can be caught, typically to perform a clean-up operation at the end of a session. If the event is caught the session will not be terminated unless the an <exit> element is processed. If the event is not caught the session will be terminated and all active connections, conferences and dialogs that are owned by that session will be automatically terminated by the platform 400
712 [6.3.6] Required Auto the ccxml.kill.unconditional event is the only event that cannot be caught by an application. It will unconditionally terminate the session and all active connections, conferences and dialogs that are owned by that session will be automatically terminated by the platform. 400
714 [6.3.6] Required Auto The ccxml.kill event contains a sessionid property set to the identifier of the session that has sent the event. 400
715 [6.3.6] Required Auto The ccxml.kill event contains a reason property set to a string describing the reason the platform sent the ccxml.kill event 400
721 [6.3.7] Required Auto The ccxml.created event contains a sessionid property set to identifier of the newly created CCXML session. This is the same identifier as was returned on the sessionid attribute of the <createccxml> request that created the session 400
724 [6.3.8] Required Auto The error.createccxml event contains a sessionid property set to identifier of the failing CCXML session. This is the same identifier as was returned on the sessionid attribute of the <createccxml> request that created the session 400
725 [6.3.8] Required Auto The error.createccxml event contains a reason property set the a string describing the error encountered 400
310 [7.1] Optional Auto A CCXML platform MAY support interaction with several dialog systems with the selection of the particular technology being based on the MIME type specified when the dialog is initiated. 400
311 [7.1] Required Auto CCXML implementations MUST support the <dialogprepare>, <dialogstart>, and <dialogterminate> elements though the exact behaviour may vary depending on the dialog environments supported. 400
312 [7.2.1.1] Required Auto A <dialogprepare> element does not block the processing of further events by the CCXML session. 400
313 [7.2.1.1] Required Auto The use of the <dialogprepare> element is entirely optional, applications may choose to simply use <dialogstart> without prior preparation. 400
315 [7.2.1.1] Required Auto In the case of a dialog manager that does not support preparation, the CCXML implementation MUST as a minimum, note the values provided in the <dialogprepare> attributes, create a Dialog object, and return a new unique value to the location defined by the dialogid attribute and throw a dialog.prepared event. 400
1181 [7.2.1.2] Required Auto A <dialogprepare> element MAY have a parameters attribute whose value is a Var-list of one or more whitespace separated CCXML variable names. These variables are sent to the dialog environment as a list of name/value pairs. 400
1182 [7.2.1.2] Required Auto The parameters attribute value of <dialogprepare> is a Var-list. Names are sent exactly as they are specified. Values are formed by converting the referenced ECMAScript variable to string form (which is undefined for objects). 400
1233 [7.2.1.2] Required Auto In <dialogprepare> element, if the attribute value of dialogid is invalid, an error.semantic event MUST be thrown. 400
317 [7.2.1.2] Required Auto A <dialogprepare> element MUST have a src attribute 400
318 [7.2.1.2] Required Auto The src attribute value of <dialogprepare> is an ECMAScript expression which returns a character string identifying the URI of the dialog document that the dialog interpreter should prepare. 400
319 [7.2.1.2] Required Auto A <dialogprepare> element MAY have a type attribute whose value is an ECMAScript expression that MUST contain a valid MIME type. 400
320 [7.2.1.2] Required Auto A <dialogprepare> element MAY have a namelist attribute whose value is a Var-list of zero or more whitespace separated CCXML variable names. These variables MUST be submitted to the server, with the same qualification as used in the namelist. 400
321 [7.2.1.2] Required Auto The namelist attribute value of <dialogprepare> is a Var-list. When an ECMAscript variable is submitted to the server, its value MUST be first converted into a string before being submitted. 400
322 [7.2.1.2] Required Auto A <dialogprepare> element MAY have a dialogid attribute whose value is an ECMAScript Left Hand Side Expression evaluating to a previously defined variable. 400
323 [7.2.1.2] Required Auto The dialogid attribute value of <dialogprepare> is an ECMAScript left hand side expression, whose value MUST receive a dialog identifier value for the launched dialog interpreter instance. 400
324 [7.2.1.2] Required Auto A <dialogprepare> element MAY have a connectionid attribute whose value is an ECMAScript Expression which returns the identifier of a connection. If specified, the dialog being prepared MUST be joined to the referenced connection as specified by the mediadirection attribute. 400
326 [7.2.1.2] Required Auto The connectionid attribute value of <dialogprepare> is an ECMAScript expression. If the attribute value is invalid, an error.semantic event MUST be thrown. 400
327 [7.2.1.2] Required Auto A <dialogprepare> element MAY have a conferenceid attribute whose value is an ECMAScript Expression which returns the identifier of a conference bridge. If specified, the dialog being prepared MUST be joined to the referenced conference as specified by the mediadirection attribute. 400
328 [7.2.1.2] Required Auto The conferenceid attribute value of <dialogprepare> is an ECMAScript expression. If the attribute value is invalid, an error.semantic event MUST be thrown. 400
329 [7.2.1.2] Required Auto A <dialogprepare> element MAY have a mediadirection attribute whose value is an ECMAScript Expression that defines the direction of the media flow between the Dialog and the Connection or Conference. If the value is "both", it specifies a full duplex connection where the media flows in both directions. 400
330 [7.2.1.2] Required Auto A <dialogprepare> element MAY have a mediadirection attribute whose value is an ECMAScript Expression that defines the direction of the media flow between the Dialog and the Connection or Conference. If the value is "dialogtransmit", the dialog transmits media to the Connection or Conference but does not receive any media streams 400
331 [7.2.1.2] Required Auto A <dialogprepare> element MAY have a mediadirection attribute whose value is an ECMAScript Expression that defines the direction of the media flow between the Dialog and the Connection or Conference. If the value is "dialogreceive", the dialog receives media from the Connection or Conference but does not transmit any media streams. 400
332 [7.2.1.2] Required Auto A <dialogprepare> element MAY have a maxage attribute whose value is a valid time value for the HTTP 1.1 request [RFC2616]. 400
333 [7.2.1.2] Required Auto A <dialogprepare> element MAY have a maxstale attribute whose value is a valid time value for the HTTP 1.1 request [RFC2616]. 400
335 [7.2.1.2] Required Auto A <dialogprepare> element MAY have a enctype attribute, whose value is an ECMAScript expression which returns a character string that indicates the media encoding type of the submitted document. If the value is "application/x-www-form-urlencoded", this indicates that the ccxml variables specified in the namelist will be url encoded. 400
336 [7.2.1.2] Required Auto A <dialogprepare> element MAY have a method attribute whose value is an ECMAScript expression which returns a character string that indicates the HTTP method to use. Values defined by the specification are: GET and POST. 400
337 [7.2.2.1] Required Auto The <dialogstart> element MUST include either a URI reference to the initial document for the dialog or the identity of a previously prepared dialog. 400
338 [7.2.2.1] Required Auto When a <dialogstart> is executed, the dialog executes on a separate logical execution thread (this MAY be a thread, process, or system depending upon platform implementation) and does not block the processing of further events by the CCXML session. 400
339 [7.2.2.1] Required Auto If the connectionid attribute of <dialogstart> is specified, and if the dialog language allows access to telephony variables such as ANI, DNIS and UUI, values of these variables MUST be propagated from the specified connection to the dialog application. 400
340 [7.2.2.1] Required Auto If the prepareddialogid attribute is specified and any attribute values conflict with the values specified in the <dialogprepare> element this MUST result in the throwing of an error.dialog.notstarted event. 400
802 [7.2.2.1] Required Auto When the dialog completes, a dialog.exit event MUST be posted to the event queue of the CCXML session that started it. 400
1184 [7.2.2.2] Required Auto A <dialogstart> element MAY have a parameters attribute whose value is a Var-list of one or more whitespace separated CCXML variable names. These variables are sent to the dialog environment as a list of name/value pairs. 400
1185 [7.2.2.2] Required Auto The parameters attribute value of <dialogstart> is a Var-list. Names are sent exactly as they are specified. Values are formed by converting the referenced ECMAScript variable to string form (which is undefined for objects). 400
1186 [7.2.2.2] Required Auto A <dialogstart> element MAY have a parameters attribute. This attribute MUST NOT be specified in conjunction with the prepareddialogid attribute. 400
1213 [7.2.2.2] Required Auto In <dialogstart> element, if the attribute value of dialogid is invalid, an error.semantic event MUST be thrown. 400
1296 [7.2.2.2] Required Auto In <dialogstart> element, if the dialog was previously prepared using a dialogprepare element with a connectionid or conferenceid specified, and this attribute is also specified, execution of the dialogstart MUST fail with an error.dialog.notstarted event. 400
342 [7.2.2.2] Required Auto A <dialogstart> element MAY have a src attribute. This attribute MUST NOT be specified in conjunction with the prepareddialogid attribute. 400
343 [7.2.2.2] Required Auto The src attribute value of <dialogstart> is an ECMAScript expression which returns a character string identifying the URI of the dialog document that the dialog interpreter MUST load and begin execution upon startup. 400
345 [7.2.2.2] Required Auto The preparedialogid attribute value of <dialogstart> is an ECMAScript expression which returns a dialog identifier of a dialog previously prepared by the execution of a <dialogprepare> element. 400
347 [7.2.2.2] Required Auto A <dialogstart> element MAY have a type attribute. This attribute MUST NOT be specified in conjunction with the prepareddialogid attribute. 400
348 [7.2.2.2] Required Auto The type attribute value of <dialogstart> is an ECMAScript expression that MUST contain a valid MIME type. 400
349 [7.2.2.2] Required Auto A <dialogstart> element MAY have a namelist attribute. This attribute MUST NOT be specified in conjunction with the prepareddialogid attribute. 400
350 [7.2.2.2] Required Auto A <dialogstart> element MAY have a namelist attribute whose value is a Var-list of zero or more whitespace separated CCXML variable names. These variables MUST be submitted to the web server, with the same qualification as used in the namelist. 400
351 [7.2.2.2] Required Auto A <dialogstart> element MAY have a namelist attribute whose value is a Var-list of one or more whitespace separated CCXML variable names. When an ECMAscript variable is submitted to the web server, its value MUST first converted into a string before being submitted. 400
352 [7.2.2.2] Required Auto A <dialogstart> element MAY have a dialogid attribute whose value is an ECMAScript Left Hand Side Expression evaluating to a previously defined variable. The value of the attribute MUST receive a dialog identifier value for the launched dialog interpreter instance. 400
353 [7.2.2.2] Required Auto A <dialogstart> element MAY have a connectionid attribute whose value is an ECMAScript expression which returns the identifier of a connection. If specified, the dialog being started MUST be joined to the referenced connection as specified by the mediadirection attribute. 400
357 [7.2.2.2] Required Auto In <dialogstart> element, if the attribute value of connectionid is invalid an error.semantic event MUST be thrown. 400
358 [7.2.2.2] Required Auto A <dialogstart> element MAY have a conferenceid attribute whose value is an ECMAScript Expression which returns the identifier of`a conference bridge. If specified, the dialog being started MUST be joined to the referenced conference as specified by the mediadirection attribute. 400
359 [7.2.2.2] Required Auto In <dialogstart> element, if the attribute value of conferenceid is invalid an error.semantic event MUST be thrown. 400
360 [7.2.2.2] Required Auto A <dialogstart> element MAY have a mediadirection attribute whose value is an ECMAScript Expression that defines the direction of the media flow between the Dialog and the Connection or Conference. If the value is "both", it specifies a full duplex connection where the media flows in both directions. 400
361 [7.2.2.2] Required Auto A <dialogstart> element MAY have a mediadirection attribute whose value is an ECMAScript Expression that defines the direction of the media flow between the Dialog and the Connection or Conference. If the value is "dialogtransmit", the dialog transmits media to the Connection or Conference but does not receive any media streams 400
362 [7.2.2.2] Required Auto A <dialogstart> element MAY have a mediadirection attribute whose value is an ECMAScript Expression that defines the direction of the media flow between the Dialog and the Connection or Conference. If the value is "dialogreceive", the dialog receives media from the Connection or Conference but does not transmit any media streams. 400
363 [7.2.2.2] Required Auto In <dialogstart> element, if both the mediadirection and the prepareddialogid are specified and the bridge type specified by the mediadirection attribute does not match that used on the previous <dialogprepare> element, an error.dialog.notstarted event MUST be raised. 400
365 [7.2.2.2] Required Auto A <dialogstart> element MAY have a maxage attribute whose value is a valid time value for the HTTP 1.1 request [RFC2616]. 400
366 [7.2.2.2] Required Auto In <dialogstart> element, the maxage attribute MUST NOT be specified used with prepareddialogid. 400
367 [7.2.2.2] Required Auto A <dialogstart> element MAY have a maxstale attribute whose value is a valid time value for the HTTP 1.1 request [RFC2616]. 400
368 [7.2.2.2] Required Auto In <dialogstart> element, the maxstale attribute MUST NOT be used with prepareddialogid. 400
370 [7.2.2.2] Required Auto In <dialogstart> element, the enctype attribute MUST NOT be used with prepareddialogid. 400
371 [7.2.2.2] Required Auto A <dialogstart> element MAY have a enctype attribute, whose value is an ECMAScript expression which returns a character string that indicates the media encoding type of the submitted document. If the value is "application/x-www-form-urlencoded", this indicates that the ccxml variables specified in the namelist will be url encoded. 400
372 [7.2.2.2] Required Auto A <dialogstart> element MAY have a method attribute whose value is an ECMAScript expression which returns a character string that indicates the HTTP method to use. Values defined by the specification are: GET and POST. 400
373 [7.2.2.2] Required Auto In <dialogstart> element, the method attribute MUST NOT be used with prepareddialogid. 400
375 [7.2.3.1] Required Auto A dialog terminated due to the processing of a <dialogterminate> element MAY still return data to the CCXML application using a dialog.exit event if the value of the immediate attribute is false or unspecified. 400
376 [7.2.3.1] Required Auto In a <dialogterminate> element, if the immediate attribute is set to true, the dialog MUST NOT return data to the CCXML application and the CCXML interpreter MUST post a dialog.exit event immediately. 400
377 [7.2.3.2] Required Auto A <dialogterminate> element MUST have a dialogid attribute whose value is an ECMAScript expression which returns a character string identifying the dialog. 400
378 [7.2.3.2] Required Auto A <dialogterminate> element MUST have a dialogid attribute. If the attribute value is invalid, an error.semantic event MUST be thrown. 400
379 [7.2.3.2] Required Auto A <dialogterminate> element MAY have an immediate attribute whose value is an ECMAScript expression which returns a character string, that identifies the termination style of the dialog. Valid values are: true and false. 400
1189 [7.3.2] Required Auto A dialog.started event MUST contain a dialog property set to an ECMAScript object reference to the dialog object identified by the dialogid property of this event. 400
381 [7.3.2] Required Auto The dialog.started event MUST be thrown when a dialog is successfully started. 400
383 [7.3.2] Required Auto A dialog.started event MUST contain a dialogid property set to the ID of the dialog. 400
384 [7.3.2] Required Auto A dialog.started event MAY contain a connectionid property set to the identifier of the connection to which the dialog connection is bridged (usually the connectionid that was specified in the <dialogstart> or <dialogprepare>). 400
385 [7.3.2] Required Auto A dialog.started event MAY contain a connectionid property. If the dialog is bridged to a conference the value MUST be undefined. 400
386 [7.3.2] Required Auto A dialog.started event MAY contain a conferenceid property set to the identifier of the conference to which the dialog connection is bridged (usually the conferenceid that was specified in the <dialogstart> or <dialogprepare>). 400
387 [7.3.2] Required Auto A dialog.started event MAY contain a conferenceid property. If the dialog is bridged to a connection the value MUST be undefined. 400
1191 [7.3.3] Required Auto A dialog.exit event MUST contain a dialog property set to an ECMAScript object reference to the dialog object identified by the dialogid property of this event. 400
388 [7.3.3] Required Auto The dialog.exit event MUST be thrown when a dialog terminates normally. 400
389 [7.3.3] Required Auto The dialog.exit event MUST be thrown when a dialog terminates following a <dialogterminate> request. 400
391 [7.3.3] Required Auto A dialog.exit event MUST contain a dialogid property set to the ID of the dialog. 400
392 [7.3.3] Required Auto A dialog.exit event MAY contain a connectionid property set to the identifier of the connection to which the dialog connection is bridged (usually the connectionid that was specified in the <dialogstart> or <dialogprepare>). 400
393 [7.3.3] Required Auto A dialog.exit event MAY contain a connectionid property. If the dialog is bridged to a conference the value MUST be undefined. 400
394 [7.3.3] Required Auto A dialog.exit event MAY contain a conferenceid property set to the identifier of the conference to which the dialog connection is bridged (usually the conferenceid that was specified in the <dialogstart> or <dialogprepare>). 400
395 [7.3.3] Required Auto A dialog.exit event MAY contain a conferenceid property. If the dialog is bridged to a connection the value MUST be undefined. 400
397 [7.3.3] Required Auto A dialog.exit event MAY contain a values property. Return values from the dialog. In VoiceXML this would be the values of each of the objects listed in the exit element's namelist. 400
1193 [7.3.4] Required Auto A dialog.disconnect event MUST contain a dialog property set to an ECMAScript object reference to the dialog object identified by the dialogid property of this event. 400
398 [7.3.4] Required Auto The dialog.disconnect event represents a request by a dialog to disconnect the Connection or Conference with which it is presently associated. 400
401 [7.3.4] Required Auto A dialog.disconnect event MUST contain a dialogid property set to the ID of the dialog. 400
402 [7.3.4] Required Auto A dialog.disconnect event MAY contain a connectionid property set to the identifier of the connection to which the dialog connection is bridged (usually the connectionid that was specified in the <dialogstart> or <dialogprepare>). 400
403 [7.3.4] Required Auto A dialog.disconnect event MAY contain a connectionid property, if the dialog is bridged to a conference the value MUST be undefined. 400
404 [7.3.4] Required Auto A dialog.disconnect event MAY contain a conferenceid property set to the identifier of the conference to which the dialog connection is bridged (usually the conferenceid that was specified in the <dialogstart> or <dialogprepare>). 400
405 [7.3.4] Required Auto A dialog.disconnect event MAY contain a conferenceid property, if the dialog is bridged to a connection the value MUST be undefined. 400
407 [7.3.4] Required Auto A dialog.disconnect event MAY contain a values property. Return values from the dialog. In VoiceXML this would be the values of each of the objects listed in the dialog element's namelist. 400
1195 [7.3.5] Required Auto A dialog.transfer event MUST contain a dialog property set to an ECMAScript object reference to the dialog object identified by the dialogid property of this event. 400
408 [7.3.5] Required Auto The dialog.transfer event represents a request by a dialog to transfer the Connection or Conference with which it is presently associated to a new destination. 400
410 [7.3.5] Required Auto A dialog.transfer event MUST contain a dialogid property set to the ID of the dialog. 400
411 [7.3.5] Required Auto A dialog.transfer event MAY contain a connectionid property set to the identifier of the connection to which the dialog connection is bridged (usually the connectionid that was specified in the <dialogstart> or <dialogprepare>). 400
412 [7.3.5] Required Auto A dialog.transfer event MAY contain a connectionid property, if the dialog is bridged to a conference the value MUST be undefined. 301
413 [7.3.5] Required Auto A dialog.transfer event MAY contain a conferenceid property set to the identifier of the conference to which the dialog connection is bridged (usually the conferenceid that was specified in the <dialogstart> or <dialogprepare>). 301
414 [7.3.5] Required Auto A dialog.transfer event MAY contain a conferenceid property, if the dialog is bridged to a connection the value MUST be undefined. 400
415 [7.3.5] Required Auto A dialog.transfer event MUST contain a type property, which contains a string value specifying the transfer type. 400
416 [7.3.5] Required Auto A dialog.transfer event MUST contain a URI property, which contains a URI describing the destination to which this call MUST be transfered. The format of this information is protocol and platform specific but might consist of a telephone URI [ RFC2806 ] or a SIP URI [ RFC3261 ]. 400
419 [7.3.5] Required Auto A dialog.transfer event MUST contain a maxtime property, which contains a string in CSS2 format that specifies the maximum amount of time the transfer may stay connected. 400
420 [7.3.5] Required Auto A dialog.transfer event MUST contain a maxtime property, if the amount of the transfer time is unlimited, the value of maxtime MUST be 0s. 400
421 [7.3.5] Required Auto A dialog.transfer event MUST contain a connecttimeout property, which contains a string in CSS2 format that specifies the maximum amount of time to spend while attempting to connect the call. 400
422 [7.3.5] Required Auto A dialog.transfer event MAY contain an aai property, if specified by the dialog. This property contains a string of application-to-application information. 400
838 [7.3.5] Required Auto The aai property of dialog.transfer, if specified by the dialog, MUST be passed to the destination party when establishing the transfer. 400
1197 [7.3.6] Required Auto A dialog.terminatetransfer event MUST contain a dialog property set to an ECMAScript object reference to the dialog object identified by the dialogid property of this event. 400
425 [7.3.6] Required Auto A dialog.terminatetransfer event MUST contain a dialogid property set to the ID of the dialog. 400
426 [7.3.6] Required Auto A dialog.terminatetransfer event MAY contain a connectionid property set to the identifier of the connection to which the dialog connection is bridged (usually the connectionid that was specified in the <dialogstart> or <dialogprepare>). 400
427 [7.3.6] Required Auto A dialog.terminatetransfer event MAY contain a connectionid property, if the dialog is bridged to a conference the value MUST be undefined. 301
428 [7.3.6] Required Auto A dialog.terminatetransfer event MAY contain a conferenceid property set to the identifier of the conference to which the dialog connection is bridged (usually the conferenceid that was specified in the <dialogstart> or <dialogprepare>). 301
429 [7.3.6] Required Auto A dialog.terminatetransfer event MAY contain a conferenceid property, if the dialog is bridged to a connection the value MUST be undefined. 400
430 [7.3.6] Required Auto A dialog.terminatetransfer event MUST contain a reason property, which contains a string value specifying a description of the reason the dialog wants the transfer to be terminated. Content of this field is platform-specific. 400
1199 [7.3.7] Required Manual A error.dialog event MUST contain a dialog property set to an ECMAScript object reference to the dialog object identified by the dialogid property of this event. 400
1201 [7.3.7] Required Manual When error.dialog is processed, the platform MUST implicitly tear down any existing bridges to the dialog and send a conference.unjoined to the CCXML document once the media paths have been freed. 400
885 [7.3.7] Required Manual The error.dialog event MUST be thrown when there was an unspecified error with the dialog (for example the dialog server crashed). 400
887 [7.3.7] Required Manual A error.dialog event MUST contain a dialogid property set to the ID of the dialog. 400
888 [7.3.7] Required Manual A error.dialog event MAY contain a connectionid property set to the identifier of the connection to which the dialog connection was connected to (usually the connectionid that was specified in the <dialogstart> or <dialogprepare>). 400
889 [7.3.7] Required Manual A error.dialog event MAY contain a connectionid property, if the dialog was being connected to a conference the value MUST be undefined. 400
890 [7.3.7] Required Manual A error.dialog event MAY contain a conferenceid property set to the identifier of the conference to which the dialog connection was connected to (usually the conferenceid that was specified in the <dialogstart> or <dialogprepare>). 400
891 [7.3.7] Required Manual A error.dialog event MAY contain a conferenceid property, if the dialog was being connected to a connection the value MUST be undefined. 400
892 [7.3.7] Required Manual A error.dialog event MUST contain a reason property, which contains a description of the reason the dialog had an error. Content of this field is platform-specific. 400
1203 [7.3.8] Required Auto A error.dialog.notstarted event MUST contain a dialog property set to an ECMAScript object reference to the dialog object identified by the dialogid property of this event. 400
431 [7.3.8] Required Auto The error.dialog.notstarted event MUST be thrown when the processing of a <dialogstart> element fails because the dialog cannot be started for some reason. 400
433 [7.3.8] Required Auto A error.dialog.notstarted event MUST contain a dialogid property set to the ID of the dialog. 400
434 [7.3.8] Required Auto A error.dialog.notstarted event MAY contain a connectionid property set to the identifier of the connection to which the dialog connection could not be started (usually the connectionid that was specified in the <dialogstart> or <dialogprepare>). 400
435 [7.3.8] Required Auto A error.dialog.notstarted event MAY contain a connectionid property, if the dialog was being connected to a conference the value MUST be undefined. 400
436 [7.3.8] Required Auto A error.dialog.notstarted event MAY contain a conferenceid property set to the identifier of the conference to which the dialog connection could not be started (usually the conferenceid that was specified in the <dialogstart> or <dialogprepare>). 400
437 [7.3.8] Required Auto A error.dialog.notstarted event MAY contain a conferenceid property, if the dialog was being connected to a connection the value MUST be undefined. 400
438 [7.3.8] Required Auto A error.dialog.notstarted event MUST contain a reason property, which contains a description of the reason the dialog could not be started. Content of this field is platform-specific. 400
1204 [7.3.10] Required Auto A dialog.user.* (where * is the name of the user defined event) event MUST contain a dialog property set to an ECMAScript object reference to the dialog object identified by the dialogid property of this event. 400
447 [7.3.10] Required Auto The dialog.user.* (where * is the name of the user defined event) event MUST be thrown when a dialog sends a user/application-defined event. 400
449 [7.3.10] Required Auto A dialog.user.* (where * is the name of the user defined event) event MUST contain a dialogid property set to the ID of the dialog. 400
450 [7.3.10] Required Auto A dialog.user.* (where * is the name of the user defined event) event MAY contain a connectionid property set to the identifier of the connection to which the dialog connection is bridged (usually the connectionid that was specified in the <dialogstart> or <dialogprepare>). 400
451 [7.3.10] Required Auto A dialog.user.* (where * is the name of the user defined event) event MAY contain a connectionid property, if the dialog is bridged to a conference the value MUST be undefined. 400
452 [7.3.10] Required Auto A dialog.user.* (where * is the name of the user defined event) event MAY contain a conferenceid property set to the identifier of the conference to which the dialog connection is bridged (usually the conferenceid that was specified in the <dialogstart> or <dialogprepare>). 400
453 [7.3.10] Required Auto A dialog.user.* (where * is the name of the user defined event) event MAY contain a conferenceid property, if the dialog is bridged to a connection the value MUST be undefined. 400
455 [7.3.10] Required Auto A dialog.user.* (where * is the name of the user defined event) event MAY contain a values property of type ECMAScript object to return values from the dialog for the user event. 400
1206 [7.3.11] Required Auto A dialog.prepared event MUST contain a dialog property set to an ECMAScript object reference to the dialog object identified by the dialogid property of this event. 400
456 [7.3.11] Required Auto The dialog.prepared event MUST be thrown when a dialog has been successfully prepared following the execution of a <dialogprepare> element. 400
458 [7.3.11] Required Auto A dialog.prepared event MUST contain a dialogid property set to the ID of the dialog. 400
459 [7.3.11] Required Auto A dialog.prepared event MAY contain a connectionid property set to the identifier of the connection to which the dialog connection is prepared (usually the connectionid that was specified in the <dialogprepare>). 400
460 [7.3.11] Required Auto A dialog.prepared event MAY contain a connectionid property, if the dialog was prepared without a connection, the value MUST be undefined. 400
461 [7.3.11] Required Auto A dialog.prepared event MAY contain a conferenceid property set to the identifier of the conference to which the dialog connection is prepared(usually the conferenceid that was specified in the <dialogprepare>). 400
462 [7.3.11] Required Auto A dialog.prepared event MAY contain a conferenceid property, if the dialog was prepared without a conference, the value MUST be undefined. 400
1208 [7.3.12] Required Auto A error.dialog.notprepared event MUST contain a dialog property set to an ECMAScript object reference to the dialog object identified by the dialogid property of this event. 400
463 [7.3.12] Required Auto The error.dialog.notprepared event MUST be thrown when the processing of a <dialogprepare> element fails. 400
465 [7.3.12] Required Auto A error.dialog.notprepared event MUST contain a dialogid property set to the ID of the dialog. 400
466 [7.3.12] Required Auto A error.dialog.notprepared event MAY contain a connectionid property set to identifier of the connection to which the dialog connection was attempting to be prepared (usually the connectionid that was specified in the <dialogprepare>). 400
467 [7.3.12] Required Auto A error.dialog.notprepared event MAY contain a connectionid property, if the dialog was prepared without a connection, the value MUST be undefined. 400
468 [7.3.12] Required Auto A error.dialog.notprepared event MAY contain a conferenceid property set to the identifier of the conference to which the dialog connection was attempting to be prepared (usually the conferenceid that was specified in the <dialogprepare>). 400
469 [7.3.12] Required Auto A error.dialog.notprepared event MAY contain a conferenceid property, if the dialog was prepared without a conference, the value MUST be undefined. 400
470 [7.3.12] Required Auto A error.dialog.notprepared event MUST contain a reason property, contains a description of the reason the dialog could not be prepared. Content of this field is platform-specific. 400
1297 [7.4] Required Auto A Dialog object MUST contain a objecttype property. It contains the type of this object which must be 'dialog'. 400
473 [7.4] Required Auto An instance of the Dialog object is associated with each dialog created by <dialogstart> or <dialogprepare> and referenced in the session.dialogs associative array. 400
474 [7.4] Required Auto A Dialog object MUST contain a dialogid property. It contains the ECMAScript string value of the Dialog identifier, which uniquely identifies each instance of the Dialog class. 400
480 [7.4] Required Auto A Dialog object MUST contain a type property. It contains an ECMAScript string value that specifies the MIME type of the document that loaded the dialog. 400
481 [7.4] Required Auto A Dialog object MUST contain a src property. It is an ECMAScript string value identifying the initial URI of the dialog document. 400
1167 [8.2.1] Required Auto The session scope is opened by CCXML implementation before interpretation of a new session starts and exists until the session exits. 400
1168 [8.2.1] Required Auto The application scope is opened by CCXML implementation before interpretation of a new session starts and exists until the session exits. 400
1169 [8.2.1] Required Auto Unlike in the session scope, variables in the application scope can be modified by CCXML programs. 400
1170 [8.2.1] Required Auto Variables defined within the application scope are visible to all documents within the CCXML application. 400
1171 [8.2.1] Required Auto This ccxml scope is opened by CCXML implementation for each CCXML document when it is loaded and exists while the document is loaded. 400
1172 [8.2.1] Required Auto Variables in the ccxml scope can also be created without an explicit declaration by assigning a value to a property of the ccxml object (ccxml.varname = value). 400
1173 [8.2.1] Required Auto Variables in the transition scope can also be created without an explicit declaration by assigning a value to a property of the transition object (transition.varname = value). 400
729 [8.2.1] Required Auto It is illegal to make an assignment to a variable that has not been explicitly declared using <var> or a var statement within a <script>. Attempting to assign to an undeclared variable causes an error.semantic event to be thrown 400
730 [8.2.1] Required Auto An attempt to declare ECMAScript object properties such as "obj.prop1" results in an error.semantic event being thrown. 400
732 [8.2.1] Required Auto A local variable declared in a <transition> is only available within that <transition> element. 400
733 [8.2.1] Required Auto The implementation MUST define four scopes - session, application, ccxml and transition. 400
735 [8.2.1] Required Auto Variables defined in the session scope are provided by CCXML implementation and are read-only. Any attempt to modify the session object or it's properties by the application MUST result in an error.semantic event to be thrown by the platform. 301
736 [8.2.1] Required Auto Variables within the application scope cannot be explicitly declared using <var> element or var statement within a <script>. They can be created only by assigning a value to a property of the application object (application.varname = value). 400
737 [8.2.1] Required Auto Variables defined in the ccxml scope are declared with <var> and <script> elements that are children of <ccxml>. 400
738 [8.2.1] Required Auto Variables defined in the ccxml scope are initialized in document order when the document is loaded. They exist while the document is loaded. 400
739 [8.2.1] Required Auto Variables defined in the ccxml scope are visible only within that document in which they are declared. 400
740 [8.2.1] Required Auto Each <transition> element has a scope that exists while the implementation is processing the executable content within that <transition>, and which is visible to the elements of that <transition>. 400
741 [8.2.1] Required Auto Variables with transition scope are declared by <var> and <script> child elements of <transition>. 400
742 [8.2.1] Required Auto The child <var> and <script> elements of <transition> are initialized in document order when the executable content is executed. 400
743 [8.2.1] Required Auto The implementation MUST instantiate a variable within the scope of the closest containing scope element. 400
744 [8.2.1] Required Auto The fully-qualified name of a variable is the name of the variable's scope object prepended with a dot to the name of the variable. 400
745 [8.2.1] Required Auto The implementation MUST allow reference to variables by their fully qualified names. 400
746 [8.2.1] Required Auto The implementation MUST allow reference to variables without requiring use of their fully qualified names. In the case of like-named variables declared in different scopes, the implementation MUST reference the variable in the closest containing scope, unless the fully-qualified variable name is used. 400
747 [8.2.1] Required Auto The implementation MUST resolve variables by searching the enclosing transition scope first (if applicable) followed by the ccxml scope, the application scope and then the session scope, unless the variable reference is qualified with a scope prefix. 400
748 [8.2.1] Required Auto If the variable includes a scope prefix, the implementation MUST resolve the variable by searching the named scope. 400
749 [8.2.1] Required Auto If a variable is declared more than once, the implementation MUST evaluate the expr attribute of each subsequent declaration, and assign the result to the variable declared by the first <var>. 400
750 [8.2.1] Required Auto The implementation MUST evaluate the ECMAScript expression contained in the expr attribute of <assign>, and assign the results to the variable referenced in the name attribute. 400
752 [8.2.1] Required Auto A <var> element must contain a name attribute. 400
753 [8.2.1] Required Auto A <var> element may contain an expr attribute. If the expr attribute is provided, the content of the expr attribute becomes the initial value of the new variable. 400
754 [8.2.1] Required Auto If an expr attribute is not provided on <var>, the new variable is initialized to ECMAScript undefined. 400
755 [8.2.1] Required Auto An <assign> element must provide a name attribute. 400
756 [8.2.1] Required Auto An <assign> element must provide a expr attribute. 400
1174 [8.2.2] Required Auto If the script cannot be fetched the implementation must throw an error.fetch event. 400
1271 [8.2.2] Required Auto If a <createccxml> element is used to fetch a document containing a <script> where both the src and fetchid attributes are present, the implementation must throw an error.createccxml event. 400
757 [8.2.2] Required Auto <script> encloses computations written in the ECMAScript Compact Profile scripting language 400
758 [8.2.2] Required Auto An implementation MUST support the ECMAScript Compact Profile 400
759 [8.2.2] Optional Auto An implementation MAY support the full ECMA-262 ECMAScript specification. 400
760 [8.2.2] Required Auto An implementation MUST support <script> within the <ccxml> element 400
761 [8.2.2] Required Auto An implementation MUST support <script> within executable content. <transition> and <if> contain executable content. 400
762 [8.2.2] Required Auto The implementation MUST evaluate script in a <ccxml> immediately after the document is loaded, along with any <var> and <assign> elements, in document order. 400
763 [8.2.2] Required Auto When used as a child of the <ccxml> element, <script> cannot be used to execute dynamically fetched content obtained using <fetch>. 400
764 [8.2.2] Required Auto The implementation MUST evaluate <script> in executable content as it is processed. 400
765 [8.2.2] Required Auto The ECMAScript contained within the <script> can declare variables with the ECMAScript var statement. Variables declared in this manner are declared in the scope of the closest containing scope CCXML element. They are known from the point of declaration to the end of the containing scope. 400
766 [8.2.2] Required Auto The implementation MUST allow reference to these variables from CCXML and from ECMAScript, using either the fully-qualified variable name, or the declared name 400
767 [8.2.2] Required Auto If the implementation is unable to run the script referenced it MUST throw an error.semantic event. 400
768 [8.2.2] Required Auto A <script> element may contain a src attribute that contains the URI which references a resource which is the script content, and which will be resolved when the CCXML document is compiled. 400
769 [8.2.2] Required Auto A <script> element may contain a fetchid atribute that contains an ECMAScript expression which returns the fetch identifier of a completed fetch request, acquired either in a fetch with the fetchid attribute, or from the fetchid attribute of a fetch.done event. 400
770 [8.2.2] Required Auto If the fetch identifier is invalid, has not completed, or the fetched content is not valid ECMAScript, an error.semantic event is thrown. 400
772 [8.2.2] Required Auto If a <fetch> element is used to fetch a document containing a <script> where both the src and fetchid attributes are present, the implementation must throw an error.fetch event. 400
773 [8.2.2] Required Auto A <script> element may contain a timeout attribute to be used when the src attribute is specified. The script fetch will fail if not completed at the end of this interval. A failed fetch will return the error.fetch event. 400
774 [8.2.2] Required Auto A <script> element may contain a maxage attribute to be used when the src attribute is specified. This indicates that the document is willing to use content whose age is no greater than the specified time in seconds 400
775 [8.2.2] Required Auto The document is not willing to use stale script content, unless maxstale is also provided. 400
777 [8.2.2] Required Auto A <script> element may contain a charset attribute set the character encoding type of the script. UTF-8 and UTF-16 encodings of ISO/IEC 10646 must be supported. 400
778 [8.2.2] Required Auto If an enctype attribute is not provided, UTF-8 is used as the default value. 400
1031 [8.3] Required Auto Variables defined in the session scope are subject to the parent scope chain delegation model but do not have a parent scope defined. 400
1033 [8.3] Required Auto session.ioprocessors is an associative Array which contains a list of external event I/O access URIs which are available to the current session. The array is associative and each key in the array is the type of the event I/O processor. 400
1034 [8.3] Required Auto session.values is an associative array which contains a list of session parameters passed on session creation 400
1175 [8.3] Required Auto If the interpreter fetched multiple documents as a result of one or more HTTP redirects (e.g. 302), the value of session.uri is set to the URI of the final target. 400
1176 [8.3] Required Auto session.uri includes the query string used when fetching the document, if one is present. 400
779 [8.3] Required Auto The session variables are defined by the CCXML implementation when the CCXML session is created 400
780 [8.3] Required Auto Session variables are read-only to the running script and cannot be modified by the CCXML program. 301
781 [8.3] Required Auto New session variables cannot be declared by CCXML programs. 400
782 [8.3] Required Auto Session variable values visible to a CCXML application reflect the state of the executing CCXML session, current as of the occurrence of the event being processed. Regardless of when session variables are updated to reflect changes, the CCXML implementation is REQUIRED to provide the correct values when accessed by a CCXML program. 400
783 [8.3] Required Auto session.startupmode indicates the startup mode that the script was started as. 400
784 [8.3] Required Auto For a new incoming call, session.startupmode will be set to 'newcall' 400
786 [8.3] Required Auto For a session that was started due to a <createccxml> request, session.startupmode will be set to 'createccxml' 400
787 [8.3] Required Auto session.id is a globally unique string that indicates the session identifier of the executing CCXML session. 400
788 [8.3] Required Auto session.uri is a URI that was used when creating the current CCXML session. 400
789 [8.3] Required Auto session.parentid is a string that indicates the session identifier of the parent of the CCXML session that created this session. 400
790 [8.3] Required Auto In the case the current session has no parent, the value of session.parentid will be ECMAScript undefined. 400
791 [8.3] Required Auto session.connections is an array which contains a list of the Connection objects that the session is currently using. The array is associative and each key in the array is the connection identifier for the Connection. 400
792 [8.3] Required Auto session.conferences is an associative array which contains a list of Conference objects with which the session is attached using <createconference> 400
793 [8.3] Required Auto session.dialogs is an associative Array which contains a list of the Dialog objects that the session is currently using. The array is associative and each key in the array is the dialog identifier for the Dialog. 400
1035 [8.4] Required Auto Application variables that are not properties, e.g. objects, must be declared 400
1177 [8.4] Required Auto CCXML provides application variables which persist across the CCXML application 400
795 [8.4] Required Auto Application variables can be modified by CCXML programs. 400
796 [8.4] Required Auto Application variables that are properties of the application object are not explicitly declared. 400
797 [8.4] Required Auto By default, application variables have the value ECMAScript undefined. 400
798 [8.4] Required Auto Variables in the application scope are subject to the parent scope chain delegation model and have session as their parent scope. 400
799 [8.4] Required Auto The application object is initialized by the CCXML implementation 400
800 [8.4] Required Auto Application variables are visible within all documents which form the CCXML application. 400
1218 [9.1] Optional Auto Platforms SHOULD reject standard events that do not contain all mandatory properties defined by the specification for that event. 400
1219 [9.1] Optional Auto When rejecting a standard event sent using <send> or external event I/O processors, platforms SHOULD notify the sender of the rejection. 400
1220 [9.1] Required Auto Events are queued on a first-in, first-out (FIFO) basis, except where specific exceptions are noted in the specification for certain events. 400
1221 [9.1] Required Auto Events sent using <send> which specify a delay are not delivered to the target queue until the specified delay has elapsed. 400
1223 [9.1] Required Auto During the processing of an event by the EHIA, the state of any ECMAScript objects exposed by a platform, such as the Connection object, MUST reflect the state of the CCXML session immediately following the occurrence of the event. 400
1224 [9.1] Required Auto It is REQUIRED that the ECMAScript context for the session is updated to reflect state changes caused by an event prior to the selection of a matching <transition>. 400
1225 [9.1] Required Auto An <eventprocessor> MAY declare a state variable attribute that corresponds to a variable declared at CCXML scope. 400
493 [9.1] Required Auto Received CCXML events named "ccxml.kill" or with a prefix of "ccxml.kill." are placed at the head of the event queue 400
494 [9.1] Required Auto Received CCXML events named with a prefix of "error." are placed at the head of the event queue, but behind any events named "ccxml.kill" or prefixed with "ccxml.kill." or "error.". 400
495 [9.1] Required Auto Received CCXML events that are not named "ccxml.kill" or prefixed by "ccxml.kill." or "error." are placed at the tail of the event queue 400
497 [9.1] Required Auto The EHIA removes the event at the front of the event queue of a CCXML session and selects the <transition> (if any) that accepts the type of the event, accepts the current value of the ECMAScript state variable, has a satisfied conditional expression, and appears first in the <eventprocessor> document order. 400
500 [9.1] Required Auto If the EHIA selects a matching <transition> for an event, an object representing the event is created at transition scope, and the child elements of the <transition> are executed in document order. 400
501 [9.1] Required Auto If the EHIA finds no matching <transition>, and the event is not named "ccxml.kill" and not prefixed with either "ccxml.kill." or "error.", then the event is simply discarded. 400
502 [9.1] Required Auto If the EHIA finds no matching <transition>, and the event is named "ccxml.kill" or is prefixed with "ccxml.kill." or with "error.", then the CCXML session processing the event is terminated. 400
505 [9.2.1] Required Auto A valid CCXML document MUST only have a single <eventprocessor> 400
507 [9.2.1] Required Auto If an <eventprocessor> defines a state variable, then the named state variable MUST be declared in the ccxml scope using a <var> or <script> 400
508 [9.2.1] Required Auto An <eventprocessor> MUST contain only <transition> elements 400
1226 [9.2.2] Required Auto The contents of the received event object MUST be made available via the transition scoped ECMAScript variable named "event$" 400
1227 [9.2.2] Required Auto The event$ variable is accessible from the <transition> cond attribute to allow CCXML Applications to conditionally select <transition>'s based on the contents of the event. 400
1246 [9.2.2] Required Auto If a <transition> specifies a state attribute but its parent <eventprocessor> does not contain a statevariable attribute, the interpreter MUST fail to load the document. 400
509 [9.2.2] Required Auto In order to be selected, a <transition> MUST satisfy criteria on its state, cond, and name attributes. 400
510 [9.2.2] Required Auto A <transition> element MAY contain a state attribute that lists, separated by whitespace, the values of the <eventprocessor> state variable that are accepted 400
511 [9.2.2] Required Auto The state attribute of a <transition> matches an event if the current value of the <eventprocessor> state variable is identical to one of the states listed in the state attribute, or if the state attribute is not present 400
512 [9.2.2] Required Auto A <transition> element MAY contain an event attribute that specifies a pattern used to match an event's name 400
513 [9.2.2] Required Auto The event attribute of a <transition> matches an event only if it matches the name of the event, or if the event attribute is not present. In matching the event attribute to the event name, the character '*' is a wild-card and matches zero or more characters of the event's name. 400
514 [9.2.2] Required Auto A <transition> element MAY contain a cond attribute that specifies an ECMAScript Boolean expression. 400
515 [9.2.2] Required Auto The cond attribute of a <transition> matches an event only if it evaluates to true, or if it is not present 400
1228 [9.2.3] Required Auto If the targettype attribute on <send> is not supported, the platform MUST throw an error.send.targettypeinvalid event. 400
1230 [9.2.3] Required Auto Platforms MUST support a targettype attribute with a value of basichttp to target the Basic HTTP Event I/O Processor specified in App.K. 400
1231 [9.2.3] Required Auto When <send> is used with name and namelist, and the targettype is ccxml, variables specified in namelist, which may themselves be ECMAScript objects, are added as properties of the event object. 400
1232 [9.2.3] Required Auto When <send> is used with the name and namelist attributes, and the targettype is "basichttp", each variable in the namelist is sent to the web server as defined in App.K 400
1247 [9.2.3] Required Auto The <send> element MAY contain a name attribute that indicates the type of event being generated, consisting of alphanumeric characters, with the exception of the first character which MUST NOT be a dot or a digit. 400
1248 [9.2.3] Required Auto The <send> element MAY contain a namelist attribute, which is a list of zero or more whitespace separated CCXML variable names to be included with the event. 400
1249 [9.2.3] Required Auto Events generated by <send> MUST have their the eventid attribute set to the identifier generated and returned via sendid. 400
1250 [9.2.3] Required Auto Events generated by <send> MUST have their eventsource attribute set to the session ID of the CCXML session performing the <send>. 400
1251 [9.2.3] Required Auto Events generated by <send> MUST have their eventsourcetype attribute set to the string 'ccxml'. 400
519 [9.2.3] Required Auto The <send> element MUST contain a target attribute that specifies the unique identifier of the event target that the Event I/O processor must send the event to. 400
520 [9.2.3] Required Auto If the value of the target attribute is not supported, invalid, or unreachable by the Event I/O processor, the implementation must throw an error.send.targetunavailable event. 400
521 [9.2.3] Required Auto The <send> element MAY contain a targettype attribute that specifies the Event I/O processor to which the event must be sent. 400
522 [9.2.3] Required Auto Platforms MUST support a targettype attribute with a value of ccxml to target the CCXML Session Event Processor. 400
524 [9.2.3] Required Auto The <send> element MUST specify the content of the message to be sent using either the name attribute with an optional namelist attribute that is a space-separated namelist of ECMAScript variables to include, or through inline XML content. 400
530 [9.2.3] Required Auto When a message is sent successfully to a target, a send.successful event MUST be thrown 400
531 [9.2.3] Required Auto If the send request fails, an event signifying the error MUST be returned to the CCXML Session. 400
532 [9.2.3] Required Auto The <send> element MAY contain a sendid attribute which provides a left hand side ECMAScript expression which must receive an internally generated unique string identifier that is associated with the event being sent 400
533 [9.2.3] Required Auto The <send> element MAY contain a delay attribute that is an ECMAScript expression evaluating to a CSS2-formatted interval by which sending of the specified event will be delayed 400
534 [9.2.3] Required Auto The queue of delayed events MUST be maintained locally and purged if the session issuing the request terminates before the event is sent. 400
1253 [9.2.4] Required Auto If <move> is unsupported the CCXML platform MUST raise an error.move event. 301
536 [9.2.4] Required Auto A <move> attempt MUST fail if the referenced event source does not exist, or is not owned by the session performing the <move> 202
537 [9.2.4] Required Auto A <move> attempt MUST fail if the referenced event source is immovable 202
539 [9.2.4] Required Auto A <move> attempt MUST fail if the target session does not exist or cannot accept the event source being moved 202
540 [9.2.4] Required Auto If a <move> attempt fails, an error.move event MUST be generated 202
541 [9.2.4] Required Auto If a <move> attempt succeeds, a move.successful event MUST be generated against the session that performed the <move> 202
545 [9.2.4] Required Auto The <move> element MUST contain either an event attribute, or a source attribute, but not both, or else an error.fetch event will be thrown 202
546 [9.2.4] Required Auto The <move> element MAY contain a source attribute that is an ECMAScript expression that returns a connection ID or a dialog ID identifying the event source to be moved to the target session 202
549 [9.2.4] Required Auto The <move> element MUST contain a sessionid attribute that is an ECMAScript expression which identifies the session to which the event source must be moved 202
1254 [9.2.5] Required Auto If <cancel> is successful, a cancel.successful event MUST be delivered to indicate that the cancelled event was not delivered 400
550 [9.2.5] Required Auto The <cancel> element MUST contain a sendid attribute that is an ECMAScript expression evaluating to the event identifier of an event to be removed from the delayed event queue of the session performing the <cancel> 400
551 [9.2.5] Required Auto If the delay on the referenced event has already expired and the event has been delivered, then the <cancel> request MUST fail and an error.notallowed event MUST be generated 400
1255 [9.3.1] Required Auto An error.notallowed event MUST have a tagname property set to the ECMAScript string value of the name of the element that produced the error (ie accept, reject, etc). 400
552 [9.3.1] Required Auto This error event is MUST be thrown when the execution of an element causes an invalid operation to be performed on a session and/or connection. 400
554 [9.3.1] Required Auto An error.notallowed event MUST have a sessionid property set to the ID of the affected session 400
556 [9.3.1] Required Auto An error.notallowed event MUST have a reason property that describes the reason the operation was denied 400
557 [9.3.2] Required Auto An error.semantic MUST be thrown when there is a semantic error in a CCXML element 400
559 [9.3.2] Required Auto An error.semantic event MUST have a reason property set to the ECMAScript string value of the printable error message associated with this error 400
560 [9.3.2] Required Auto An error.semantic event MUST have a tagname property set to the name of the element that produced the error 400
561 [9.3.2] Required Auto An error.semantic event MAY have an attributelist property that is an object whose properties are the names of the attributes of the element in error. The value of each such property MAY be set to the corresponding string value of the attribute 400
562 [9.3.3] Required Auto An error.send.targetunavailable event MUST be thrown when CCXML could not send the event to the target listed in <send> due to it currently being unavailable 400
564 [9.3.3] Required Auto An error.send.targetunavailable event MUST have a sendid property that is the ID of the affected event 400
565 [9.3.3] Required Auto An error.send.targetunavailable event MUST have a reason property that describes the reason the operation was denied 400
566 [9.3.4] Required Auto An error.send.targettypeinvalid event MUST be thrown when the targettype attribute specified in a <send> is not valid 400
568 [9.3.4] Required Auto An error.send.targettypeinvalid event MUST have a sendid property that is the ID of the affected event 400
569 [9.3.4] Required Auto An error.send.targettypeinvalid event MUST have a reason property that describes the reason the operation was denied 400
570 [9.3.5] Required Auto An error.send.failed event MUST be thrown when a <send> could not be completed for a reason not covered by another error.send.* event. 400
572 [9.3.5] Required Auto An error.send.failed event MUST have a sendid property that is the ID of the affected event 400
573 [9.3.5] Required Auto An error.send.failed event MUST have a reason property that describes the reason the operation was denied 400
574 [9.3.6] Required Auto An send.successful event MUST be thrown when an event is successfully delivered to the specified receiver 400
576 [9.3.6] Required Auto An send.successful event MUST have a sendid property that is the ID of the sent event 400
577 [9.3.7] Required Auto An move.successful event MUST be thrown when an event source is successfully moved to a CCXML session 202
579 [9.3.7] Required Auto An move.successful event MUST have a sourceid that specifies the identifier of the event source that was moved 202
580 [9.3.8] Required Auto An cancel.successful event MUST be thrown when the sending of an event has been successfully cancelled. 400
582 [9.3.8] Required Auto An cancel.successful event MUST have a sendid property that is the ID of the cancelled event 400
583 [9.3.9] Required Auto An error.move event MUST be thrown when a move request performed by a session fails to complete successfully 202
585 [9.3.9] Required Auto An error.move event MUST have a sourceid property that is the ID of the event source that was the target of the <move> 202
586 [9.3.9] Required Auto An error.move event MUST have a sessionid property that is the identifier of the CCXML session to which it was attempted to move the event source 202
587 [9.3.9] Required Auto An error.move event MUST have a reason property that describes the reason the <move> request failed 202
588 [9.4.2] Required Auto All events MUST contain a name attribute containing a string name of the event 400
589 [9.4.2] Required Auto All events MUST contain an eventid attribute containing a unique identifier for the event 400
590 [9.4.2] Required Auto If an event was sent using <send>, then the eventid attribute of the event MUST match the value returned via the sendid attribute of <send> (if specified) 400
591 [9.4.2] Required Auto All events MUST contain an eventsource attribute containing a unique identifier for the event source 400
592 [9.4.2] Required Auto All events MUST contain an eventsourcetype attribute containing the name of the Event I/O processor that sent the event 400
594 [9.4.5] Required Auto All error events MUST have a reason property set to a printable error message associated with the error 400
1256 [9.5.1] Required Auto Errors that occur in the loading/compilation of a CCXML page triggered by a running CCXML document using <createccxml> MUST generate an error.createccxml event. 400
1257 [9.5.1] Required Auto Errors that occur in the loading/compilation of a CCXML page triggered by a running CCXML document using <fetch> MUST generate an error.fetch event. 400
276 [10.2] Required Auto Each Connection has one input by which it receives a media stream from another Connection or Conference. 400
277 [10.2] Required Auto Each Connection has one output media stream that can be directed to the inputs of multiple Connections and/or Conferences. 400
283 [10.2.2] Required Auto An instance of the Connection Object is associated with each telephony event source. 400
284 [10.2.2] Required Auto A Connection Object must have a connectionid property which is the ECMAScript string value of the Connection identifier, which uniquely identifies each instance of the Connection object. 400
285 [10.2.2] Required Auto A Connection Object must have a state property which identifies the current state of the Connection instance 400
1292 [10.2.3] Required Auto All Connection events MUST have a property named connectionid containing the ID of the Connection associated with the event. 400
1295 [10.2.3] Required Auto All Connection events MUST have a property named connection containing a reference to the Connection object identified by the connectionid property of this event. 400
1241 [10.2.4] Required Auto When an error.semantic event is generated by a connection element, this MUST NOT change the state of the associated Connection Object(s). 400
1286 [10.2.4] Required Auto Execution of connection elements MUST NOT immediately change the state of any associated Connection Objects 400
1086 [10.2.5] Required Auto The Connection Class MUST have the following READ-ONLY properties: states[0] = ALERTING, states[1] = PROGRESSING, states[2] = CONNECTED, states[3] = FAILED, states[4] = DISCONNECTED, states[5] = ERROR 400
1087 [10.2.5] Required Auto The Connection Class MUST have the following READ-ONLY properties: connection.ALERTING = 0, connection.PROGRESSSING = 1, connection.CONNECTED = 2, connection.FAILED = 3, connection.DISCONNECTED = 4, connection.ERROR = 5 400
12 [10.5.1.1] Required Auto The execution of an <accept> MUST cause the underlying platform to signal the telephony system to connect the specified Connection to the CCXML platform. 400
14 [10.5.1.2] Required Auto An <accept> may have a connectionid attribute 400
15 [10.5.1.2] Required Auto An <accept> may have a hints attribute 400
16 [10.5.1.2] Required Auto If the connectionid attribute is omitted, the interpreter must accept using the id indicated in the current event being processed. 400
17 [10.5.1.2] Required Auto If the attribute value is invalid or there is no valid default value, an error.semantic event must be thrown 400
19 [10.5.2.1] Required Auto When a CCXML document executes a <redirect> within the <transition> block, this MUST cause the underlying platform to signal the telephony system to send the call to a specified destination. 400
975 [10.5.2.1] Required Auto If the call is currently joined, it MUST be unjoined before the redirect is performed and a conference.unjoined event MUST be generated. Note the platform is not required to generate the conference.unjoined or connection.redirected in any particular order. 400
1088 [10.5.2.2] Required Auto If the platform is unable to redirect the call this MUST result in the generation of an error.redirect connection.redirect.failed event. 400
21 [10.5.2.2] Required Auto A <redirect> may have a connectionid attribute which is an ECMAScript expression which returns a string that is the identifier of a Connection on which a call is active or on which an incoming call is being signaled. 400
22 [10.5.2.2] Required Auto If the connectionid attribute is omitted, the interpreter must redirect using the id indicated in the current event being processed. 301
23 [10.5.2.2] Required Auto If the connection id attribute value is invalid or there is no valid default value, an error.semantic event must be thrown. 400
24 [10.5.2.2] Required Auto A <redirect> must have a dest attribute which is an ECMAScript expression which returns a string that is the address where the call should be redirected to. 400
27 [10.5.2.2] Required Auto A <redirect> may have a reason attribute which is an ECMAScript expression which returns a string that is the reason the call is being redirected. 400
28 [10.5.2.2] Required Auto A <redirect> may have a hints attribute which is the ECMAScript object returned contains information which may be used by the implementing platform or passed to the network redirecting the connection. This information may consist of protocol-specific parameters. 400
31 [10.5.3.1] Required Auto The execution of an <reject> MUST cause the underlying platform to signal the telephony system to reject the incoming Connection from the platform. 400
32 [10.5.3.2] Required Auto A <reject> may have a connectionid attribute which is an ECMAScript expression which returns a string that is the identifier of a Connection on which an incoming call is being signaled. 400
33 [10.5.3.2] Required Auto If the connection id attribute value is invalid or there is no valid default value, an error.semantic event must be thrown. 400
34 [10.5.3.2] Required Auto If the connection id attribute is omitted, the interpreter must reject using the id indicated in the current event being processed. 400
35 [10.5.3.2] Required Auto A <reject> may have a reason attribute which is an ECMAScript expression which returns a string that is the reason the call is being rejected. 400
36 [10.5.3.2] Required Auto A <reject> may have a hints attribute which is the ECMAScript object returned contains information which may be used by the implementing platform or passed to the network rejecting the connection. This information may consist of protocol-specific parameters. 400
55 [10.5.5.1] Required Auto A <createconference> instructs the implementation to allocate a Conference Object 400
56 [10.5.5.1] Required Auto The successful execution of <createconference> MUST result in the generation of a conference.created event. 400
1112 [10.5.5.2] Required Auto A conference identifier must be globally unique, so that conferences can be uniquely addressed and possibly connected to. 400
58 [10.5.5.2] Required Auto A <createconference> must have a conferenceid attribute which is an ECMAScript left hand side expression evaluating to a previously defined variable. The value of the attribute must receive the conference identifier. 400
59 [10.5.5.2] Required Auto A <createconference> may have a confname attribute which is an ECMAScript expression which returns a string that is the name of the conference. The conference name corresponds to the conference identifier that will be returned in the variable specified in the conferenceid attribute. 400
60 [10.5.5.2] Required Auto If the named conference does not exist, the platform must create a conference object as requested and return the value of the conference identifier to the variable specified in the conferenceid attribute. 400
61 [10.5.5.2] Required Auto If a conference already exists the platform must return the conference identifier of the previously created conference. 400
62 [10.5.5.2] Required Auto A <createconference> may have a reservedtalkers attribute which is an ECMAScript expression which returns the number of guaranteed speaker slots the conference mixer must reserve. 400
63 [10.5.5.2] Required Auto If the conference already exists, then the reservedtalkers attribute must be ignored. 400
65 [10.5.5.2] Required Auto A <createconference> may have a reservedlisteners attribute which is an ECMAScript expression which returns the number of guaranteed listener slots the conference mixer must reserve. 400
66 [10.5.5.2] Required Auto If the conference already exists, then the reservedlisteners attribute must be ignored. 400
68 [10.5.5.2] Required Auto A <createconference> may have a hints attribute which is the ECMAScript object returned contains information which may be used by the implementing platform when creating the conference. 400
72 [10.5.6.1] Required Auto <destroyconference> destroys the conference if no other sessions are attached to it. 400
75 [10.5.6.1] Required Auto The successful execution of <destroyconference> MUST result in the generation of a conference.destroyed event. 400
994 [10.5.6.1] Required Auto Since other sessions may have created bridges to a conference using the conference's ID, but without performing a <createconference>, destroying a conference MAY affect the bridges established by other sessions. If any bridges are terminated in this fashion, a 'conference.unjoined' event MUST be posted to indicate to the session that its Connection is no longer bridged to the Conference. 400
77 [10.5.6.2] Required Auto A <destroyconference> must have a conferenceid attribute. The conferenceid attribute returns a string that is the identifier of the conference that should be destroyed. 400
79 [10.5.6.2] Required Auto If the conferenceid attribute value is invalid an error.semantic event must be thrown. 400
80 [10.5.6.2] Required Auto <destroyconference> may have a hints attribute which is an ECMAScript object that contains information which may be used by the implementing platform when destroying the conference. 400
1269 [10.5.7.1] Required Auto When joining a Connection or Dialog to a Conference, or when joining two Conferences, the 'conference.joined' event MUST NOT result in multiple 'conference.joined' events if the session performing the <join> is attached to the conference, nor if any session owns both conferences when two conferences are joined together. 301
82 [10.5.7.1] Required Auto <join> instructs the implementation to bridge the connections specified using the id1 and id2 attributes in accordance with media options specified by the other attributes of <join>. 400
83 [10.5.7.1] Required Auto The successful execution of <join> MUST result in the generation of a conference.joined event. 400
85 [10.5.7.1] Required Auto When joining a Connection or Dialog to a Conference, or when joining two Conferences, the 'conference.joined' event MUST be posted to all sessions that are attached to the affected Conference(s). 400
854 [10.5.7.1] Required Auto <join> instructs the implementation to bridge the conferences specified using the id1 and id2 attributes in accordance with media options specified by the other attributes of <join>. 301
855 [10.5.7.1] Required Auto <join> instructs the implementation to bridge the dialogs specified using the id1 and id2 attributes in accordance with media options specified by the other attributes of <join>. 301
962 [10.5.7.1] Required Auto Any Connections or Dialogs referenced by the 'id1' and 'id2' attributes of <join> MUST be owned by the session performing the <join>. 400
101 [10.5.7.2] Required Manual The default value of entertone is "true". 301
102 [10.5.7.2] Required Manual If the value of entertone is 'true' the default system beep will be played. 301
103 [10.5.7.2] Required Manual If the value of entertone is 'false' no alerting sound being played at all. 301
104 [10.5.7.2] Required Manual If the entertone value is a URL which points to a user-defined wav file, that wav file will be played instead of the default system beep. 301
107 [10.5.7.2] Required Manual The default value of exittone is "true". 301
108 [10.5.7.2] Required Manual If the value of exittone is 'true' the default system beep will be played. 301
109 [10.5.7.2] Required Manual If the value of exittone is 'false' no alerting sound being played at all. 301
110 [10.5.7.2] Required Manual If the exittone value is a URL which points to a user-defined wav file, that wav file will be played instead of the default system beep. 301
126 [10.5.7.2] Required Manual The default value of dtmfclamp is "true". 301
87 [10.5.7.2] Required Auto <join> must have an id1 attribute. 400
88 [10.5.7.2] Required Auto id1 returns a string that is the identifier of a Connection, Dialog or Conference. 400
89 [10.5.7.2] Required Auto If the id1 attribute value is invalid an error.semantic event will be thrown. 400
90 [10.5.7.2] Required Auto <join> must have an id2 attribute. 400
91 [10.5.7.2] Required Auto id2 returns a string that is the identifier of a Connection, Dialog or Conference. 400
92 [10.5.7.2] Required Auto If the id2 attribute value is invalid an error.semantic event will be thrown. 400
93 [10.5.7.2] Required Auto <join> may have a duplex attribute. This is an ECMAScript expression that returns a character string equal to "half" or "full" which defines the direction of the media flow between id1 resource and id2 resource. 400
95 [10.5.7.2] Required Auto The default value of duplex is "full". 400
98 [10.5.7.2] Required Auto <join> may have a hints attribute which is an ECMAScript object containing information which may be used by the implementing platform or passed to the network when the two specified Connections, Dialogs or Conferences (id1 and id2) are joined. 400
136 [10.5.8.1] Required Auto <unjoin> will instruct the implementation to tear down the bridge between two connections/conferences/dialogs specified using the id1 and id2 attributes. 400
137 [10.5.8.1] Required Auto The successful execution of<unjoin> MUST result in the generation of a conference.unjoined event. 400
138 [10.5.8.1] Required Auto If for any reason the implementation is unable to terminate the bridge between the specified connections, or if no such bridge exists, it MUST fail with a error.conference.unjoin event. 400
139 [10.5.8.1] Required Auto When 'id1', 'id2', or both reference to a Conference, the 'conference.unjoined' event MUST be posted to all session that are attached to the affected Conference(s). 400
858 [10.5.8.1] Required Auto If for any reason the implementation is unable to terminate the bridge between the specified conferences, or if no such bridge exists, it MUST fail with a error.conference.unjoin event. 301
859 [10.5.8.1] Required Auto If for any reason the implementation is unable to terminate the bridge between the specified dialogs, or if no such bridge exists, it MUST fail with a error.conference.unjoin event. 301
977 [10.5.8.1] Required Auto Any Connections or Dialogs referenced by the 'id1' and 'id2' attributes of <unjoin> MUST be owned by the session performing the <unjoin>. 400
978 [10.5.8.1] Required Auto If the implementation is unable to unjoin the objects an error.conference.unjoin MUST only be sent to the session that issued the <unjoin>. 400
979 [10.5.8.1] Required Auto This MUST NOT result in multiple 'conference.unjoined' events if the session performing the <unjoin> is attached to the conference, or if any session owns both conferences when two conferences are being unjoined. 301
141 [10.5.8.2] Required Auto <unjoin> must have an id1 attribute which is an ECMAScript expression which returns a string that is the identifier of a Connection, Dialog or Conference. 400
143 [10.5.8.2] Required Auto If the id1 attribute value is invalid an error.semantic event must be thrown. 400
144 [10.5.8.2] Required Auto <unjoin> must have an id2 attribute which is an ECMAScript expression which returns a string that is the identifier of a Connection, Dialog or Conference. 400
146 [10.5.8.2] Required Auto If the id2 attribute value is invalid an error.semantic event must be thrown. 400
147 [10.5.8.2] Required Auto <unjoin> may have a hints attribute which is an ECMAScript object that contains information which may be used by the implementing platform or passed to the network when the two specified Connections, Dialogs or Conferences (id1 and id2) are unjoined. 400
1275 [10.5.9.1] Required Auto The platform is not required to generate the connection.disconnected /connection.failed or conference.unjoined in any particular order, unless an outbound call was abandoned in which case a connection.failed event MUST be generated 400
148 [10.5.9.1] Required Auto During execution of <disconnect>, the underlying platform MUST send the appropriate protocol messages to perform the disconnect, and send an asynchronous event to the CCXML document when the disconnect operation completes. 400
151 [10.5.9.1] Required Auto If the connection had been bridged when the <disconnect> request was made, the platform MUST tear down all bridges to the connection and send a conference.unjoined to the CCXML document once the media paths have been freed. 400
963 [10.5.9.1] Required Auto A CCXML document may use <disconnect> to abandon an outbound connection created using <createcall> which has not yet entered the CONNECTED state. 400
964 [10.5.9.1] Required Auto If <disconnect> is used to abandon an outbound call, it results in the generation of a 'connection.disconnected' event. 400
152 [10.5.9.2] Required Auto <disconnect> may have a connectionid attribute. Connectionid returns a string that is the id of a call leg that should be disconnected. 400
154 [10.5.9.2] Required Auto If the connectionid attribute is omitted, the interpreter will disconnect using the id indicated in the current event being processed. 400
155 [10.5.9.2] Required Auto If the attribute value is invalid or there is no valid default value, an error.semantic event must be thrown. 400
156 [10.5.9.2] Required Auto <disconnect> may have a reason attribute. Reason returns a string that is the reason the call is being disconnected. 400
158 [10.5.9.2] Required Auto <disconnect> may have a hints attribute which is an ECMAScript object that contains information which may be used by the implementing platform or passed to the network disconnecting the connection. 400
1115 [10.6.3] Required Auto The connection.progressing event is a transition to state PROGRESSING. 400
182 [10.6.3] Required Auto This event MUST be emitted when the underlying telephony connection sends a notification of call progress while the Connection Object is in the PROGRESSING state. 400
188 [10.6.3] Required Auto Subsequent connection.progressing events MAY be generated to support protocols which exchange multiple messages during the PROGRESSING state. 301
1116 [10.6.4] Required Auto The connection.connected event is a transition to state CONNECTED. 400
189 [10.6.4] Required Auto This event must be emitted when an incoming connection is accepted successfully, or as when an outgoing connection is answered. 400
1107 [10.6.5] Required Auto If this is an off-platform disconnected event, the platform MUST implicitly tear down any existing bridges to the connection and send a conference.unjoined to the CCXML document once the media paths have been freed. 400
1108 [10.6.5] Required Auto The connection.disconnected event must contain a trigger attribute that indicates which entity caused the disconnection to occur. 400
1109 [10.6.5] Required Auto Valid values for the attribute trigger are 'network' for network-initiated disconnections, 'platform' for disconnections triggered by platform-based rules (such as a maximum connection duration), or 'application' for disconnections performed as a result of application actions (such as execution of a <disconnect>). 400
1117 [10.6.5] Required Auto The connection.disconnected event is a transition to state DISCONNECTED. 400
195 [10.6.5] Required Auto This event must be emitted when a connection is disconnected due to an action by the underlying network (e.g. the user hanging up), the CCXML platform, or the CCXML application. 400
1118 [10.6.6] Required Auto The connection.redirected event is a transition to state DISCONNECTED. 400
201 [10.6.6] Required Auto This connection.redirect event MUST be emitted to indicate a successful redirection of a connection. 400
1120 [10.6.8] Required Auto The connection.failed event is a transition to state FAILED. 400
214 [10.6.8] Required Auto The connection.failed event MUST be emitted when an incoming or outgoing call fails to complete its connection. 400
218 [10.6.8] Required Auto The connection.failed event may contain a reason attribute which contains an error code if one is available 400
1123 [10.6.20] Required Auto The error.connection.wrongstate event MUST be emitted when an application attempts a telephony operation that is not legal for the current state of the Connection Object. 400
1131 [10.6.20] Required Auto The error.connection.wrongstate event MUST contain a tagname property which must be set to the ECMAScript string value of the name of the element that produced the error (ie accept, reject, etc). 400
1154 [10.6.22] Required Auto The connection.redirect.failed event MUST be emitted when an error occurs when there is an error redirecting a connection using the <redirect> element. 400
1157 [10.6.22] Required Auto The connection.redirect.failed event must contain a reason field which contains a description of the reason the redirect failed. 400
841 [App.D] Optional Auto CCXML defines an additional read-only VoiceXML session variable, also populated when the dialog is bridged to a connection, called session.connection.ccxml 400
842 [App.D] Optional Auto The session.connection.ccxml must have a read-only subproperty called sessionid which evaluates to the CCXML Session ID to which the VoiceXML dialog is currently associated. 400
843 [App.D] Optional Auto The session.connection.ccxml must have a read-only subproperty called dialogid which evaluates to the CCXML Dialog ID for the current dialog. 400
844 [App.D] Optional Auto The session.connection.ccxml must have a read-only subproperty called connectionid which evaluates to the CCXML Connection ID to which the VoiceXML dialog is currently bridged. This variable is undefined if the dialog is not bridged to a connection. 400
845 [App.D] Optional Auto The session.connection.ccxml must have a read-only subproperty called conferenceid which evaluates to the CCXML Conference ID to which the VoiceXML dialog is currently bridged. This variable is undefined if the dialog is not bridged to a conference. 400
847 [App.D] Optional Auto The session.connection.ccxml must have a read-only subproperty called values. This associative array contains the names and values of the parameters attribute supplied in a CCXML <dialogprepare> or <dialogstart> invocation. 400
848 [App.D] Optional Auto When a CCXML application processes a <dialogterminate> it causes a "connection.disconnect.hangup" event to be thrown to the VoiceXML application. 400
849 [App.D] Optional Auto When a VoiceXML application processes a VoiceXML <exit> it will cause the VoiceXML application to exit and return the contents of the namelist attribute to the CCXML application in the "dialog.exit" event. 400
850 [App.D] Optional Auto When the VoiceXML application processes a <disconnect> element it causes a "dialog.disconnect" event to be thrown in the CCXML application. It is then up to the CCXML application to disconnect the call and send back a "connection.disconnect.hangup" event by using the <dialogterminate> element. 400
1067 [App.L] Optional Manual Implementation MUST support HTTP Post 400
1069 [App.L] Optional Manual The http reserved parameter "uri" specifies the URI of the CCXML document to load. This parameter is required 400
1070 [App.L] Optional Manual The http reserved parameter "eventsource" specifies a URI to which events may be sent from the created session using, for example, the "basichttp" event processor. This parameter is optional. 400
1071 [App.L] Optional Manual Other parameters provided in the HTTP request are treated as the event payload. Single parameter values MUST be supported 400
1074 [App.L] Optional Manual In the created session, session.startupmode MUST be set to "external" 400
1075 [App.L] Optional Manual In the created session, session.uri MUST be set to the value of the uri parameter 400
1076 [App.L] Optional Manual In the created session, session.values object MUST be defined 400
1077 [App.L] Optional Manual In the created session, session.values.type MUST be set to the value "createsession" 400
1078 [App.L] Optional Manual In the created session, session.values.eventsource MUST be set to the value of the "eventsource" parameter 400
1079 [App.L] Optional Manual In the created session, Other payload parameters are exposed as properties of session.values (complex parameter names require appropriate initialization of sub-objects). 400
1080 [App.L] Optional Manual In the created session, to avoid conflict with the "type" and "eventsource" property of session.values object, payload parameters with the name "type" and "eventsource" are ignored. 400
1260 [App.L] Optional Manual The reserved http parameter 'method' which is equivalent to <createccxml>'s 'method' attribute, used to set the HTTP method applied in the fetch of the specified CCXML document. Allowed values are "get" or "post" (case-insensitive). 400
1261 [App.L] Optional Manual the http reserved parameter 'method' if missing must default to 'get'. 400

Appendices

Appendix A - Test Assertion XML API Definition

This appendix describes a framework for authoring CCXML tests. The framework abstracts the markup used to define interactions with the user, allowing vendors to use their own test infrastructure by applying an XSLT transformation to the test source. Modifications to the test infrastructure should require a change to the XSLT template only followed by re-transformation of the test source.

The appendix is divided into the following sections:

A.1 API definition

The test API described in this document uses the complete schema specified in the CCXML 1.0 specification with the addition of a set elements in their own namespace "http://www.w3.org/2005/ccxml-conformance" that greatly simplify the process of authoring tests and abstract the implementation details of the testing infrastructure. The elements are divided into the following categories:

A.1.1 Test inizializations

These elements are used to inizialize the test environment.

docsetup
This element must be the first child of <ccxml> and is used to inizialize the test environment making available the ECMA script variables that represent: Support variables values should be instantiated in the actual XSLT template and should be used as read-only.
The element sets the following ECMA expression:
current_state Event processor state variable. It is initialized to init.
TEST_CREATECALL_DEST_NOANSWER Outcall destination that does not answer.
TEST_CREATECALL_DEST_ANSWER_AND_STAY_ACTIVE1 Outcall destination that answers #1.
TEST_CREATECALL_DEST_ANSWER_AND_STAY_ACTIVE2 Outcall destination that answers #2.
TEST_CREATECALL_DEST_ANSWER_AND_STAY_ACTIVE3 Outcall destination that answers #3.
TEST_CREATECALL_DEST_ANSWER_AND_STAY_ACTIVE4 Outcall destination that answers #4.
TEST_CREATECALL_DEST_ANSWER_AND_STAY_ACTIVE5 Outcall destination that answers #5.
TEST_CREATECALL_DEST_ANSWER_AND_STAY_ACTIVE6 Outcall destination that answers #6.
TEST_CREATECALL_DEST_ANSWER_AND_STAY_ACTIVE7 Outcall destination that answers #7.
TEST_CREATECALL_DEST_ANSWER_AND_STAY_ACTIVE8 Outcall destination that answers #8.
TEST_CREATECALL_DEST_ANSWER_AND_STAY_ACTIVE9 Outcall destination that answers #9.
TEST_CREATECALL_DEST_ANSWER_AND_STAY_ACTIVE10 Outcall destination that answers #10.
TEST_CREATECALL_DEST_ANSWER_AND_DISCONNECT_SHORT Outcall destination that answers and disconnects short.
TEST_CREATECALL_DEST_ANSWER_AND_FAIL_JOIN Outcall destination that answers and fails to join.
TEST_SHORT_TIMEOUT Short timeout intialized to '10s'
TEST_LONG_TIMEOUT Long timeout initialized to '30s'.
TEST_VERY_LONG_TIMEOUT Very long timeout initialized to '150s'.
ASSERTION_NUM Assertion number. assertnum parameter passed to the XSL.
SETUP_CONNECTION_TYPE Type of setup connection. connectiontype parameter passed to the XSL.
TEST_BASIC_HTTP_URI Basic HTTP URI. Not used in this release.
TEST_IR_URI IR site URI.
TEST_ABSOLUTE_URI Absolute URI. Not used in this release.
uri_UNREACHEABLE A URI unreacheable.

Other variable declared in this part of the XSLT must not be changed because they are part of the framework.

A.1.2 Test setup

These elements are used to setup the test.

setup
This element must be the first child of <eventprocessor> and is used to set what kind of call starts the test: The type of setup is supplied to the XSL as the connectiontype parameter, mapped into the SETUP_CONNECTION_TYPE ECMA script variable.

A.1.3 Intermediate status indicators

These elements may be used to signal intermediate results or indications.

comment
Specifies intermediate results or indications as stated in the mandatory expr attribute:
expr It contains the ECMA expression related to the intermediate information.

A.1.4 Remote side operations

These elements are used to drive remote side operations. Not used for the current implementation of the framework.

remotedisconnect
Invoke the remote side hang-up. The element supports the following attributes:
connectionid An ECMAScript expression that evaluates to the identifier of the connection on which the hang-up is invoked.

A.1.5 Final status indicators

These elements are used to signal the completion of a test.

pass
Indicates successful test completion.
fail
Indicates unexpected results from the interpreter.
not_exec
Indicates tests not executed. The element supports the following optional attributes:
event Optional. Event that caused failure.
reason Optional. An ECMAScript expression that evaluates to a string at run-time providing information about the probable cause for failure.

A.1.6 Helper functions

These elements provide helper functions to automate common tasks. Not used for the current implementation of the framework.

check-event-name
Check the presence and the correctness of the name attribute of the event. The element supports the following attributes:
event An ECMAScript expression that evaluates to the event to check.
value An ECMAScript expression that evaluates to the name of the event.

A.1.7 Unconditional Exit Expr

These elements may be used to exit unconditional with a mandatory output comment.

uncond_exit
Specifies final comment as stated in the mandatory expr attribute:
expr An ECMAScript expression that evaluates to a string at run-time providing information about the unconditional exit information.

A.2 Simple test examples

The following examples illustrate a simple use of the proposed tags. These examples were written to help validate the stylesheet, but not directly used to generate the tests. The current implementation of CCXML Implementation Report framework all the tests were based on Jumbo test, see Appendix A.3 for details.

Example 1

The following example tests that a connection.disconnected event is received when a <disconnect/> element is run. This test assumes that a connection of type connected is delivered as part of the execution of the <conf:setup/> element.

<?xml version="1.0" encoding="UTF-8" ?>
<ccxml version="1.0" xmlns="http://www.w3.org/2002/09/ccxml"
   xmlns:conf="http://www.w3.org/2005/ccxml-conformance">

  <conf:docsetup/>

  <eventprocessor statevariable="current_state">
    <conf:setup/>

    <transition event="connection.connected">
      <disconnect/>
    </transition>

    <transition event="connection.disconnected">
      <conf:pass/>
    </transition>

    <transition event="*">
      <conf:fail/>
    </transition>
  </eventprocessor>
</ccxml>

Example 2

The following example tests that a connection.disconnected event is received when the remote side hangs up. This test assumes that a connection of type connected is delivered as part of the execution of the <conf:setup/> element.

<?xml version="1.0" encoding="UTF-8" ?>
<ccxml version="1.0" xmlns="http://www.w3.org/2002/09/ccxml"
   xmlns:conf="http://www.w3.org/2005/ccxml-conformance">

  <conf:docsetup/>

  <eventprocessor statevariable="current_state">
    <conf:setup/>

    <transition event="connection.connected">
      <conf:remotedisconnect/>
    </transition>

    <transition event="connection.disconnected">
      <conf:pass/>
    </transition>

    <transition event="*">
      <conf:fail reason="'Unexpected Event ' + event$.name"/>
    </transition>
  </eventprocessor>
</ccxml>

Example 3

The following example tests that a connection.failed event is received when a call to a phone number that does not answer is placed. This test assumes that a connection of type noconnection is delivered as part of the execution of the <conf:setup/> element.

<?xml version="1.0" encoding="UTF-8" ?>
<ccxml version="1.0" xmlns="http://www.w3.org/2002/09/ccxml"
   xmlns:conf="http://www.w3.org/2005/ccxml-conformance">

  <conf:docsetup/>

  <eventprocessor statevariable="current_state">
    <conf:setup/>
    
    <transition event="ccxml.loaded">
      <createcall
             dest="TEST_CREATECALL_DEST_NOANSWER"
             timeout="TEST_LONG_TIMEOUT"/>
    </transition>

    <transition event="connection.progressing">
      <conf:comment expr="event$.name + ' received'"/>
    </transition>

    <transition event="connection.failed">
      <!-- Check timestamps to have TEST_LONG_TIMEOUT to get here -->
      <conf:pass/>
    </transition>

    <transition event="*">
      <conf:fail reason="'Unexpected Event ' + event$.name"/>
    </transition>
  </eventprocessor>
</ccxml>

Example 4

The following example tests that a connection.connected event is received when a call to a phone number that answers is placed. This test assumes that a connection of type noconnection is delivered as part of the execution of the <conf:setup/> element.

<?xml version="1.0" encoding="UTF-8" ?>
<ccxml version="1.0" xmlns="http://www.w3.org/2002/09/ccxml"
   xmlns:conf="http://www.w3.org/2005/ccxml-conformance">

  <conf:docsetup/>

  <eventprocessor statevariable="current_state">
    <conf:setup/>
    
    <transition event="ccxml.loaded">
      <createcall
            dest="TEST_CREATECALL_DEST_ANSWER_AND_STAY_ACTIVE1"
            timeout="TEST_SHORT_TIMEOUT"/>
    </transition>

    <transition event="connection.progressing">
      <conf:comment expr="event$.name + ' received'"/>
    </transition>

    <transition event="connection.connected">
      <conf:pass/>
    </transition>

    <transition event="*">
      <conf:fail reason="'Unexpected Event ' + event$.name"/>
    </transition>
  </eventprocessor>
</ccxml>

Example 5

The following example tests that a connection.connected event is received when a call to a phone number that answers is placed. This is the same as example 4 but just shows how it is possible to use a different phone number to get some other action on the remote side. This test assumes that a connection of type noconnection is delivered as part of the execution of the <conf:setup/> element.

<?xml version="1.0" encoding="UTF-8" ?>
<ccxml version="1.0" xmlns="http://www.w3.org/2002/09/ccxml"
   xmlns:conf="http://www.w3.org/2005/ccxml-conformance">

  <conf:docsetup/>

  <eventprocessor statevariable="current_state">
    <conf:setup/>
    
    <transition event="ccxml.loaded">
      <createcall
           dest="TEST_CREATECALL_DEST_ANSWER_AND_DISCONNECT_SHORT" 
           timeout="TEST_SHORT_TIMEOUT"/>
    </transition>

    <transition event="connection.progressing">
      <conf:comment expr="event$.name + ' received'"/>
    </transition>

    <transition event="connection.connected">
      <conf:pass/>
    </transition>

    <transition event="*">
      <conf:fail reason="'Unexpected Event ' + event$.name"/>
    </transition>
  </eventprocessor>
</ccxml>

Example 6

The following example tests that a conference.joined event is received when two connections are joined by means of <join/> element. This test assumes that a connection of type connected is delivered as part of the execution of the <conf:setup/> element.

<?xml version="1.0" encoding="UTF-8" ?>
<ccxml version="1.0" xmlns="http://www.w3.org/2002/09/ccxml"
   xmlns:conf="http://www.w3.org/2005/ccxml-conformance">

  <conf:docsetup/>

  <var name="firstConnection"/>
  <var name="secondConnection"/>

  <eventprocessor statevariable="current_state">
    <conf:setup/>

    <transition event="connection.connected" state="init">
      <assign name="current_state" expr="'connected'"/>
      <assign name="firstConnection" expr="event$.connectionid"/>
      <createcall
           dest="TEST_CREATECALL_DEST_ANSWER_AND_DISCONNECT_SHORT"
           connectionid="secondConnection"
           timeout="TEST_SHORT_TIMEOUT"/>
    </transition>

    <transition event="connection.progressing">
      <conf:comment expr="event$.name + ' received'"/>
    </transition>

    <transition event="connection.connected" state="connected">
      <join id1="firstConnection" id2="secondConnection"/>
    </transition>

    <transition event="conference.joined">
      <conf:pass/>
    </transition>

    <transition event="*">
      <conf:fail reason="'Unexpected Event ' + event$.name"/>
    </transition>
  </eventprocessor>
</ccxml>

Example 7

The following example tests that a connection.connected event is received when the <accept/> element is executed. This test assumes that a connection of type alerting is delivered as part of the execution of the <conf:setup /> execution.

<?xml version="1.0" encoding="UTF-8"?>
<ccxml version="1.0" xmlns="http://www.w3.org/2002/09/ccxml"
    xmlns:conf=">http://www.w3.org/2005/ccxml-conformance">

  <conf:docsetup/>
  <eventprocessor statevariable="current_state">  
    <conf:setup/>

    <transition event="connection.alerting">   
      <conf:comment expr="'Received ' + event$.name"/>
      <accept connectionid="event$.connectionid"/>
      <conf:comment
          expr="'Executed accept on connection ' + event$.connectionid"/>    
    </transition>
    
    <transition event="connection.connected">    
      <conf:comment expr="'Received ' + event$.name"/>
      <conf:pass/>    
    </transition>

    <transition event="*">    
      <conf:fail reason="'Unexpected Event ' + event$.name"/>    
    </transition>
  </eventprocessor>
</ccxml>

A.3 Jumbo test examples

This section will brefly describe the structure of a Jumbo test.

All the current tests are developed as Jumbo test, so that a single test document is able to test more than one test assertions. In Appendix C.1, the Manifest describes the association of all the test assertions in Section 7 and the corresponding Jumbo test.

In the initial part there is a "prelude", which is contained in a script element after <conf:docsetup/>. The most important function of this prelude is to initialize an "assertion queue", which contains all of the parent assertions in the Jumbo test. Each of which has its own unit test. "child" assertions are related to parent assertions, and appear inside of their parent's unit test. In the example the parent assertion is "17" and the children are: "12", "16", "17".

The Jumbo test loops on the parent assertions, by means of the "user.PREPARE_NEW" event. So the test starts when in an initial transition (depending on the test assertions to be tested either in the "connection.alerting", "connection.connected") the event "user.PREPARE_NEW" is sent. At that point the loop is started and the Pass or Fail assertions are recorded. During the loop the state variable is set to "ASSERTION_NMBR_#" of each of the parent assertions and the transitions with that state variable are the ones devoted to that assertion. During the loop the assertions passed or failed are reported, and after the last assertion the loop finishes and the session ends.

Example of a Jumbo test

<?xml version="1.0" encoding="UTF-8"?>
<ccxml xmlns="http://www.w3.org/2002/09/ccxml"
       xmlns:conf="http://www.w3.org/2005/ccxml-conformance"
       version="1.0">
<!--
Serguei's infrastructure performs a loop on the 'assertions' Ecma array,
based on "name_prepare_new" event for doing the "loop".

Mainly we have to different levels of assertions: 

- Main assertions, stored in 'assertions' array
- Children assertions, stored into 'assert_trace'

An assertion is a child assertion if it does not need to perform any action,
but it is sufficient to test its father assertion result to determine 
if it passes or fails.

The test finishes when all the main assertions have been tested. 
Children assertions are tested after the father itself.

If an unexpected event is caught by the <transition event"*"/> a comment
is printed and the loop continues with the next iteration.

An hang up event causes the interruption of test: session exits.

All the send.successful events are caught and ignored (they are generated
by the loop mechanism).
-->

  <conf:docsetup/>

  <var name="myFetchID"/>

  <var name="first_accept_ok"/>
  

  <script><![CDATA[
    var i=0;
  
    assertions[i++] = init_assertion('17');  
   
    var assert_last = i - 1;
    var assert_index = -1;
    //
    // out of the loop assertions (children)

    // Children of 17
    add_2_assert_trace('12');
    add_2_assert_trace('16');
    add_2_assert_trace('15');

    s_ASSERTIONS_LEFT = show_remained_assertions();
    var b_in_test = false;
  ]]></script>
 
 
  <eventprocessor statevariable="current_state">
    <conf:setup type="noconnection"/>

    <transition event="ccxml.loaded" state="init">
      <conf:comment expr="'Event: ' + event$.name"/>  
    </transition>
    
    <transition event="connection.alerting" state="init">
      <send targettype="'ccxml'" target="session.id" name="'user.timeout'"
            delay="TEST_LONG_TIMEOUT"/>
      <assign name="first_accept_ok" expr="false"/>
      <var name="hints" expr="new Object()"/>
      <assign name="hints.test" expr="'test'"/>
            <accept hints="hints"/>
    </transition>
    <transition event="connection.connected" state="init">
      <conf:comment expr="'Event: ' + event$.name"/>
      <assign name="first_accept_ok" expr="true"/>   
      <send targettype="'ccxml'" target="session.id" name="name_prepare_new"/>
    </transition>

    <transition event="user.PREPARE_NEW">
      <conf:comment expr="'Event: ' + event$.name"/>
      <if cond="assert_index >= 0">
        <assign name="ASSERTION_NUM" expr="assertions[assert_index].number"/>
        <assign name="t_ASSERT_RESULT" expr="assertions[assert_index].P_F"/>
        <script>assertions[assert_index].reason = t_ASSERT_REASON;</script>
      <if cond="t_ASSERT_RESULT == s_PASS">
        <conf:pass reason="t_ASSERT_REASON"/>
      <elseif cond="t_ASSERT_RESULT == s_FAIL"/>
        <conf:fail reason="t_ASSERT_REASON"/>
      <else/>
        <conf:not_exec reason="t_ASSERT_REASON"/>
      </if>
    </if>
    <assign name="assert_index" expr="assert_index + 1"/>
    <if cond="assert_index > assert_last">
      <log label="s_TA" expr="s_ASSERTIONS_LEFT"/>
      <conf:uncond_exit expr="'DONE'"/>
    <else/>
      <log label="s_TA" expr="s_ASSERTIONS_LEFT"/>
      <assign name="ASSERTION_NUM" expr=" assertions[assert_index].number"/>
      <assign name="t_ASSERT_REASON" expr="''"/>
      <script>assertions[assert_index].P_F = s_FAIL;</script>
      <assign name="current_state" expr="state_prefix + ASSERTION_NUM"/>
      <send targettype="'ccxml'" target="session.id"
            name="start_name_prefix + ASSERTION_NUM"/>
    </if>
  </transition>

              
<!--
17.
If the attribute value is invalid or there is no valid default value,
an error.semantic event must be thrown

12.
The execution of an <accept> MUST cause the underlying platform 
to signal the telephony system to connect the specified Connection 
to the CCXML platform. 

16.
If the connectionid attribute is omitted, the interpreter must accept 
using the id indicated in the current event being processed.
-->

    <transition event="user.START_ASSERTION_17" state="ASSERTION_NMBR_17">  
      <conf:comment
        expr=" 'Current state : ' +current_state+ ' , Event: ' + event$.name"/>     

      <!-- Begin Related Tests -->
      <if cond="first_accept_ok">
        <assign name="ASSERTION_NUM" expr="'12'"/>  
        <conf:pass/>
        <assign name="ASSERTION_NUM" expr="'16'"/>  
        <conf:pass/>
        <assign name="ASSERTION_NUM" expr="'15'"/>  
        <conf:pass/>    
      <else/>
        <assign name="ASSERTION_NUM" expr="'12'"/>  
        <conf:fail/>
        <assign name="ASSERTION_NUM" expr="'16'"/>  
        <conf:fail/>
        <assign name="ASSERTION_NUM" expr="'15'"/>  
        <conf:fail/>    
      </if>
      <!-- End Related Tests -->
    
      <accept/>
    </transition>

    <transition event="error.semantic" state="ASSERTION_NMBR_17">  
      <conf:comment 
        expr=" 'Current state : ' +current_state+ ' , Event: ' + event$.name"/>  
      <script>assertions[assert_index].P_F = s_PASS;</script>     
      <send targettype="'ccxml'" target="session.id" name="name_prepare_new"/>
    </transition>
    
    <transition event="error.*" state="ASSERTION_NMBR_17">  
      <conf:comment 
        expr=" 'Current state : ' +current_state+ ' , Event: ' + event$.name"/>  
      <script>assertions[assert_index].P_F = s_FAIL;</script>     
      <assign name="t_ASSERT_REASON" expr="'error.semantic expected' "/>
   <send targettype="'ccxml'" target="session.id" name="name_prepare_new"/>
    
    </transition>

 <!--  ***************** COMMON ******************************** -->
    <transition event="send.successful">
    </transition>

    <transition event="user.timeout">
      <assign name="current_state" expr="'GEN'"/>
      <conf:uncond_exit expr="'TEST-TIMEOUT.' + show_remained_assertions()"/>
    </transition>
  
    <transition event="connection.disconnected">
      <conf:uncond_exit expr="'CONNECTION-DISCONNECTED'"/>
    </transition>
 
    <transition event="*">
      <assign name="t_ASSERT_REASON"
        expr="'UNEXPECTED EVENT ' + event$.name + ' IN STATE ' + current_state"/>
      <conf:comment expr="t_ASSERT_REASON"/>
      <if cond="current_state == 'init'">
        <conf:uncond_exit expr="'Did not come out from init state.'"/>
      <else/>
        <send targettype="'ccxml'" target="session.id" name="name_prepare_new"/>
      </if>   
    </transition>
 
  </eventprocessor>
</ccxml>

A.4 XML Schema

The following XML Schema succintly declares the Test API markup elements, their attributes, and the legal values for those attributes if applicable.

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
         elementFormDefault="qualified">
  <xs:element name="docsetup"/>
  <xs:element name="setup"/>
  <xs:element name="pass"/>
  <xs:element name="fail">
    <xs:complexType>
      <xs:attribute name="event" type="xs:string" use="optional"/>
      <xs:attribute name="reason" type="ECMAScript.expression"
               use="optional"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="not_exec">
    <xs:complexType>
      <xs:attribute name="event" type="xs:string" use="optional"/>
      <xs:attribute name="reason" type="ECMAScript.expression"
               use="optional"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="comment">
    <xs:complexType>
      <xs:attribute name="expr" type="ECMAScript.expression"
               use="required"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="remotedisconnect"/>
    <xs:complexType>
      <xs:attribute name="connectionid" type="ECMAScript.expression"
               use="required"/>
    </xs:complexType>
  <xs:element name="check-event-name">
    <xs:complexType>
      <xs:attribute name="event" type="xs:string" use="required"/>
      <xs:attribute name="value" type="ECMAScript.expression" 
               use="required"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="assignXSLvar">
    <xs:complexType>
      <xs:attribute name="name" type="xs:string" use="required"/>
      <xs:attribute name="var" type="xs:string" use="required"/>
    </xs:complexType>
  </xs:element>
  <xs:simpleType name="ECMAScript.expression">
    <xs:restriction base="xs:string"/>
  </xs:simpleType>
  <xs:element name="uncond_exit">
    <xs:complexType>
      <xs:attribute name="expr" type="ECMAScript.expression"
               use="required"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

The XML Schema can be used to validate the testing documents, or to transform the test source through the XSLT, and validate the output against the CCXML 1.0 Schema.

A.5 Sample XSLT Template Definition

The following is the listing of the XSLT that can be used to transform the previous examples into a valid CCXML 1.0 document. This XSLT is part of the framework for CCXML Implementation Report.

<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright 1998-2010 W3C (MIT, ERCIM, Keio), All Rights Reserved. See http://www.w3.org/Consortium/Legal/. -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                   xmlns:conf="http://www.w3.org/2005/ccxml-conformance"
                   xmlns="http://www.w3.org/2002/09/ccxml" version="1.0">
 <xsl:output cdata-section-elements="script" indent="yes"/>
 <!-- Assume assertion number is passed in -->
 <xsl:param name="assertnum"/>
 <xsl:param name="connectiontype"/>
 <!-- ############################################# -->
 <!-- D o c u m e n t   H e a d e r s               -->
 <!-- ############################################# -->
 <!-- Copy everything that doesn't match other rules -->
 <xsl:template match="/ | @* | node()">
  <xsl:copy>
   <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
 </xsl:template>
 <!-- strip comments -->
 <xsl:template match="comment()"/>
 <!-- ############################################# -->
 <!-- F i n a l   S t a t u s   I n d i c a t o r s -->
 <!-- ############################################# -->
 <!-- Success criteria -->
 <xsl:template match="conf:pass">
  <xsl:call-template name="conf-pass">
   <xsl:with-param name="reason" select="@reason"/>
  </xsl:call-template>
 </xsl:template>
 <xsl:template name="conf-pass">
  <xsl:param name="reason"/>
  <script>remove_from_assert_trace(ASSERTION_NUM);</script>
  <xsl:choose>
   <xsl:when test="$reason != ''">
    <log label="s_TA+ASSERTION_NUM" expr="s_PASS + {$reason}"/>
   </xsl:when>
   <xsl:otherwise>
    <log label="s_TA+ASSERTION_NUM" expr="s_PASS"/>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>
 <!-- Failure criteria -->
 <xsl:template match="conf:fail">
  <xsl:call-template name="conf-fail">
   <xsl:with-param name="reason" select="@reason"/>
  </xsl:call-template>
 </xsl:template>
 <xsl:template name="conf-fail">
  <xsl:param name="reason"/>
  <script>remove_from_assert_trace(ASSERTION_NUM);</script>
  <xsl:choose>
   <xsl:when test="$reason != ''">
    <log label="s_TA+ASSERTION_NUM" expr="s_FAIL + {$reason}"/>
   </xsl:when>
   <xsl:otherwise>
    <log label="s_TA+ASSERTION_NUM" expr="s_FAIL"/>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>
 <xsl:template match="conf:not_exec">
  <xsl:call-template name="conf-not_exec">
   <xsl:with-param name="reason" select="@reason"/>
  </xsl:call-template>
 </xsl:template>
 <xsl:template name="conf-not_exec">
  <xsl:param name="reason"/>
  <xsl:choose>
   <xsl:when test="$reason != ''">
    <log label="s_TA+ASSERTION_NUM" expr="s_NOT_EXECUTED + {$reason}"/>
   </xsl:when>
   <xsl:otherwise>
    <log label="s_TA+ASSERTION_NUM" expr="s_NOT_EXECUTED"/>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>
 <!-- ############################################# -->
 <!-- I n t e r m e d i a t e   R e p o r t s       -->
 <!-- ############################################# -->
 <!-- Copy everything doesn't match the other rules -->
 <xsl:template match="conf:comment">
  <log label="s_TA+ASSERTION_NUM" expr="'Comment: '+{@expr}"/>
 </xsl:template>
 <xsl:template match="conf:uncond_exit">
  <log label="s_TA" expr="{@expr} + '  EXIT.'"/>
  <exit/>
 </xsl:template>

 <!-- ############################################# -->
 <!-- Document Setup                                -->
 <!-- ############################################# -->
 <!-- Apply values to commonly used expressions -->
 <xsl:template match="conf:docsetup">
  <var name="s_NONE" expr="'NONE'"/>
  <var name="s_ASSERTIONS_LEFT"/>
  <script><![CDATA[
var trace_separator = ' ';
var assert_trace = new Object();;
function add_2_assert_trace(N){
assert_trace[N] = true;
}
function show_remained_assertions(){
var rr_ini = '';
var rr = rr_ini;
 var sIndex;
 for(sIndex in assert_trace ) {
  if( assert_trace[sIndex]){rr = rr + sIndex + trace_separator};
 }
 if (rr == rr_ini){rr = s_NONE;}
 return 'ASSERTIONS_LEFT: ' + rr;
}
function remove_from_assert_trace(N){
assert_trace[N] = false;
s_ASSERTIONS_LEFT = show_remained_assertions();
}
function init_assertion(N){
rr = Object()
rr.number = N;
rr.P_F = s_NOT_EXECUTED;
rr.reason = '';
rr.N_child = 0;
add_2_assert_trace(N);
return rr;
}
var a_tmp_1 = session.uri.split("\/");
var s_tmp_2 = a_tmp_1[a_tmp_1.length - 1];
var a_tmp_3 = s_tmp_2.split("\.");
var s_LOG_PREFIX = a_tmp_3[0]; 


]]></script>
  <var name="assertions" expr="Object();"/>
  <var name="current_state" expr="'init'"/>
  <var name="cur_event_ID"/>
  <var name="s_TA" expr="s_LOG_PREFIX + ' TA-'"/>
  <var name="s_PASS" expr="'PASS: '"/>
  <var name="s_FAIL" expr="'FAIL: '"/>
  <var name="s_NOT_EXECUTED" expr="'NOT_EXECUTED: '"/>
  <var name="state_prefix" expr="'ASSERTION_NMBR_'"/>
  <var name="name_prefix" expr="'user.ASSERTION_'"/>
  <var name="start_name_prefix" expr="'user.START_ASSERTION_'"/>
  <var name="name_prepare_new" expr="'user.PREPARE_NEW'"/>
  <var name="USER_ERROR" expr="'user.error'"/>
  <var name="TEST_CREATECALL_DEST_NOANSWER" expr="'sip:10.229.47.209'"/>
  <var name="TEST_CREATECALL_DEST_ANSWER_AND_STAY_ACTIVE" expr="new Object();"/>
  <assign name="TEST_CREATECALL_DEST_ANSWER_AND_STAY_ACTIVE[0]" expr="'sip:10.229.47.209'"/>
  <assign name="TEST_CREATECALL_DEST_ANSWER_AND_STAY_ACTIVE[1]" expr="'sip:10.229.47.111'"/>
  <assign name="TEST_CREATECALL_DEST_ANSWER_AND_STAY_ACTIVE[2]" expr="'sip:10.229.47.209'"/>
  <assign name="TEST_CREATECALL_DEST_ANSWER_AND_STAY_ACTIVE[3]" expr="'18005551004'"/>
  <assign name="TEST_CREATECALL_DEST_ANSWER_AND_STAY_ACTIVE[4]" expr="'18005551005'"/>
  <assign name="TEST_CREATECALL_DEST_ANSWER_AND_STAY_ACTIVE[5]" expr="'18005551006'"/>
  <assign name="TEST_CREATECALL_DEST_ANSWER_AND_STAY_ACTIVE[6]" expr="'18005551007'"/>
  <assign name="TEST_CREATECALL_DEST_ANSWER_AND_STAY_ACTIVE[7]" expr="'18005551008'"/>
  <assign name="TEST_CREATECALL_DEST_ANSWER_AND_STAY_ACTIVE[8]" expr="'18005551009'"/>
  <assign name="TEST_CREATECALL_DEST_ANSWER_AND_STAY_ACTIVE[9]" expr="'18005551010'"/>
  <var name="TEST_CREATECALL_DEST_ANSWER_AND_DISCONNECT_SHORT" expr="'18005552000'"/>
  <var name="TEST_CREATECALL_DEST_ANSWER_AND_FAIL_JOIN" expr="'18005553000'"/>
  <var name="TEST_SHORT_TIMEOUT" expr="'10s'"/>
  <var name="TEST_LONG_TIMEOUT" expr="'30s'"/>
  <var name="TEST_VERY_LONG_TIMEOUT" expr="'150s'"/>
  <var name="ASSERTION_NUM" expr="'{$assertnum}'"/>
  <var name="SETUP_CONNECTION_TYPE" expr="'{$connectiontype}'"/>
  <var name="t_ASSERT_RESULT"/>
  <var name="t_ASSERT_REASON" expr="''"/>
  <var name="TEST_BASIC_HTTP_URI" expr="''"/>
  <var name="TEST_IR_URI" expr="'http://10.229.47.117:8080/W3C_CCXML_IR/output/'"/>
  <var name="TEST_ABSOLUTE_URI" expr="''"/>
  <var name="uri_UNREACHEABLE" expr="'http://10.255.255.254/unrea3chable'"/>

 </xsl:template>
 <!-- ############################################# -->
 <!-- Connection Setup                              -->
 <!-- ############################################# -->
 <!-- Setup the connection requested and handle appropriate events -->
 <xsl:template match="conf:setup">
        <xsl:call-template name="conf-setup">
            <xsl:with-param name="connectiontype" select="@type"/>
        </xsl:call-template>
 </xsl:template>
 
 <xsl:template name="conf-setup">
    <xsl:param name="connectiontype"/>
    <xsl:choose>
   <xsl:when test="$connectiontype = 'alerting'">
    <transition event="ccxml.loaded">
     <log label="s_TA+ASSERTION_NUM" expr="'Started: ' + event$.name"/>
     <!-- Insert script to initiate a call here -->
    </transition>
   </xsl:when>
   <xsl:when test="$connectiontype = 'connected'">
    <transition event="ccxml.loaded">
     <log label="s_TA+ASSERTION_NUM" expr="'Started: ' + event$.name"/>
     <!-- Insert script to initiate a call here -->
    </transition>
    <transition event="connection.signal" state="init">
     <log label="s_TA+ASSERTION_NUM" expr="'Received: ' + event$.name"/>
    </transition>
    <transition event="connection.alerting" state="init">
     <log label="s_TA+ASSERTION_NUM" expr="'Received: ' + event$.name"/>
     <accept connectionid="event$.connectionid"/>
     <log label="s_TA+ASSERTION_NUM" expr="'Accepted: ' + event$.connectionid"/>
    </transition>
   </xsl:when>
   <xsl:otherwise>
    <!-- type is "noconnection" or an invalid type -->
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>
 <!-- ############################################# -->
 <!-- Remote Disconnect                              -->
 <!-- ############################################# -->
 <!-- Instruct a remote agent to disconnect the specified connection -->
 <xsl:template match="conf:remotedisconnect">
  <log label="s_TA+ASSERTION_NUM"
     expr="'RemoteDisconnect: Please hang-up connection: ' + {@connectionid}"/>
 </xsl:template>
 <!-- ############################################# -->
 <!-- Helper Functions                              -->
 <!-- ############################################# -->
 <xsl:template match="conf:check-event-name">
  <if cond="!event$.name">
   <xsl:call-template name="conf-fail">
    <xsl:with-param name="reason">
     <xsl:text>'name property not defined'</xsl:text>
    </xsl:with-param>
   </xsl:call-template>
   <elseif cond="event$.name != '{@value}'"/>
   <xsl:call-template name="conf-fail">
    <xsl:with-param name="reason">
     <xsl:text>'name property should be' + </xsl:text>
     <xsl:value-of select="@value"/>
     <xsl:text> 'but is ' + event$.name </xsl:text>
    </xsl:with-param>
   </xsl:call-template>
   <else/>
   <xsl:call-template name="conf-pass"/>
  </if>
 </xsl:template>
</xsl:stylesheet>

A.6 Transforming tests with XSLT

Using the above mentioned stylesheets, the test ".txml" source documents can be transformed into ".ccxml" test documents. To accomplish this, a Java class is used. In the "bin directory there is a class called "TestGenerator". The script can run this manually to transform all of the tests and save them in a folder named "output". The "go.sh" and similarly "go.bat" example is the following:

#!/bin/sh

java -cp bin org.w3c.ccxml.ir.TestGenerator ./manifest.xml jumbo_test-ccxml-sample.xslt ircgi-2-jsp.xslt ./output

Note that to run the TestGenerator class, JDK version has to be 1.5 or higher. To check JDK version run:

java -version

Appendix B - Abstract CGI (IRCGI) API definition

The CCXML 1.0 Implementation Report contains assertions that require server-side support to verify HTTP headers and submitted values. To allow diverse test environments to use different server-side technologies, tests describe the server-side processing using a syntax independent of any particular server-side framework.

This appendix describes a server-agnostic XML API that can be transformed easily using XSLT into any server-side framework. Reference JSP XSLT templates is provided and used for running the framework.

The API supports the following:

The XML API does not require the following:

B.1 Processing Model

A document conforming to this specification, heretofore referred to as an "IRCGI document", indicates the checks to be made on an HTTP request. Supported checks include:

Checks may be nested. The result of the checks determines the next document to be executed. The next document must continue the test and must determine the success or failure of the test. Once the IRCGI document determines the next document, a response is sent, and the IRCGI document terminates.

B.2 Syntax

An IRCGI document consists of the following elements. The DTD can be found below.

ircgi
The root document element. This element must appear as the root document element for all IRCGI documents.
comment
Contains comments that may be accumulated during CGI execution. The comments may be returned in one or more log elements in the body of the HTTP response. This may be used as a primitive debugging facility.
if-header
Checks for the presence and value of an HTTP request header. Supports the following attributes:
name Required. The name of the header. If only the name attribute is specified, the CGI must execute the if-header content only if the named header is present in the request.
value Optional. The expected value of the header. If this attribute is specified, the CGI must execute the if-header content only if the named header is present in the request and its value matches that of the value attribute. This attribute and the starts-with attribute are mutually exclusive.
starts-with Optional. The expected value with which the header begins. If this attribute is specified, the CGI must execute the if-header content only if the named header is present in the request and its value begins with the value of the starts-with attribute. This attribute and the value attribute are mutually exclusive.
ignore-case Optional. The value match is case-sensitive if the ignore-case attribute is false, the default. The match is not case-sensitive if the attribute is true.
if-method
Checks the HTTP method used to submit request. The CGI must execute the if-method content only if the type attribute's value matches the HTTP method used to submit the request. The match is case-insensitive.
type Required. The HTTP method: 'get' or 'post'.
if-parameter
Checks for the presence and value of an HTTP request parameter. Supports the following attributes:
name Required. The parameter's name. If only the name attribute is specified, the CGI must execute the if-parameter content only if the named parameter is present in the request.
This attribute and the starts-with attribute are mutually exclusive.
value Optional. The parameter's expected value. If this attribute is specified, the CGI must execute the if-parameter content only if the named parameter is present in the request and its value matches that of the starts-with attribute. This attribute and the value attribute are mutually exclusive.
starts-with Optional. The expected value with which the parameter begins. If this attribute is specified, the CGI must execute the if-parameter content only if the named parameter is present in the request and its value begins with the value of the starts-with attribute. This attribute and the value attribute are mutually exclusive.
ignore-case Optional. The value match is case-sensitive if the ignore-case attribute is false, the default. The match is not case-sensitive if the attribute is true.
if-all-params
Checks for the presence and value of all HTTP request parameters against an expected set. Supports the following attribute:
ref Required. The id of a params element containing the set of expected CGI parameters.
params
Defines a set of expected CGI parameters via one or more contained param elements. The params tag is allowed as a child of the root document element, ircgi.
id Required. A unique identifier referenced by an if-all-params element.
param
Defines the name and value of an expected CGI parameter.
name Required. The name of the CGI request parameter.
value Required. The value of the CGI request parameter.
if-upload
Checks for the presence of a file upload. Supports the following attributes:
name Required. The name of the parameter containing the uploaded bits. If only the name attribute is specified, the CGI must execute the if-upload content only if the named upload is present.
size Optional. The expected size of the upload. If this attribute is specified, the CGI must execute the if-parameter content only if the named upload is present in the request and its size matches that of the value of the size attribute. The value of this attribute can be a static numeric value or a CGI parameter name. If a name is specified, the size of the file upload is compared to the value of the specified CGI parameter. The value of the CGI parameter must resolve to a numeric value. The size value should be specified in bytes.
next
Selects the next document either ".ccxml" or ".vxml" and, optionally, sets the HTTP response code. The CGI must generate a response upon executing a next element and must not execute any other elements.
code Optional. The HTTP response code. If the code attribute is specified, its value must be used as the HTTP response status code. The default is 200 (Ok).
dest Optional. The URL of the next document. If this attribute is specified, its value must be used by the response to designate the next document to be visited.
include Optional. true or false If this attribute is true, the document specified by the dest attribute is returned as the result document. If this attribute is false, the default, the CGI returns a generated CCXML/VoiceXML document that contains a goto to the document specified by dest. The document generated when include is false may contain the content of comment elements that were encountered.
Only files that are in the directory immediately above the cgi-bin directory (see below) may be included. Attempts to include other files result in an HTTP 403 (Forbidden) response status code.
isVXML Optional. true or false If this attribute is true, the generated document is a VoiceXML 2.0 one. If this attribute is false, the default, the generated document is a CCXML 1.0 one.
sleep Optional. An interval for the CGI to sleep before returning its response to the client.
expires Optional. Sets an Expires HTTP response header to a date calculated by adding the value of the expires attribute to the current time. The value of this attribute should be a positive or negative integer in seconds.
absolute Optional. For future extensions.

B.3 IRCGI Document Type Definition

The following DTD succintly declares the IRCGI API markup elements, their attributes, and the legal values for those attributes if applicable.

<!ENTITY % ir-checks "if-header | if-method | if-parameter | if-upload | if-all-params" >

<!ELEMENT ircgi
  (params | comment | %ir-checks; | next)* >

<!ELEMENT comment (#PCDATA) > 

<!ELEMENT if-parameter
  (comment | %ir-checks; | next)*  >
<!ATTLIST  if-parameter
  name CDATA #REQUIRED
  value CDATA #IMPLIED
  starts-with  CDATA #IMPLIED
  ignore-case (true|false) "false" > 

<!ELEMENT if-all-params
  (comment | %ir-checks; | next)*  >
<!ATTLIST  if-all-params
  ref IDREF #REQUIRED> 

<!ELEMENT params
  (param+)>
<!ATTLIST params 
  id ID #REQUIRED> 

<!ELEMENT param EMPTY> 
<!ATTLIST param   
  name CDATA #REQUIRED
  value CDATA #REQUIRED>
  
<!ELEMENT if-upload
  (comment | %ir-checks;  | next)* >
<!ATTLIST if-upload 
  name CDATA  #REQUIRED
  size   CDATA #IMPLIED> 

<!ELEMENT if-header 
  (comment | %ir-checks; | next)* >
<!ATTLIST if-header
  name CDATA #REQUIRED
  value  CDATA #IMPLIED
  starts-with CDATA #IMPLIED
  ignore-case (true|false) "false" >
<!ELEMENT if-method  
  (comment | %ir-checks; | next)* >
<!ATTLIST if-method  
  type  (get|post)  "get"  > 
 
<!ELEMENT next EMPTY>
<!ATTLIST next
  code CDATA "200"
  dest CDATA #IMPLIED
  include (true|false) "false"
  isVXML (true|false) "false"
  sleep CDATA #IMPLIED
  expires CDATA #IMPLIED
  absolute CDATA #IMPLIED>

B.4 Test examples

The following examples illustrate the use of the IRCGI API elements. The examples validate the XSLT used to generate valid CGI from the test source. These tests should all pass before the XSLT is applied to the main body of tests.

Example 1 - Verifying HTTP method

If the HTTP method used is "POST", the next document is "pass.ccxml". Otherwise, the next document is "fail.ccxml". The match on method name is case-insensitive.

<?xml version="1.0"?>
<!-- Check if request method was 'POST'. -->
<ircgi>
  <if-method value="post">
    <next dest="../pass.ccxml" /> 
  </if-method>
  <next dest="../fail.ccxml" /> 
</ircgi>

Example 2 - Verifying parameter presence

If the parameter "p1" was submitted, the next document is "pass.ccxml". Otherwise, the next document is "fail.ccxml". The value of "p1" does not matter because the value attribute was specified.

<?xml version="1.0"?>
<!--
Check if parameter p1 is present.
-->
<ircgi>
  <if-parameter name="p1">
      <next dest="../pass.ccxml" /> 
  </if-parameter>
  <next dest="../fail.ccxml" /> 
</ircgi>

Example 3 - Verifying parameter values

If parameter "p1" has the value "42" and if parameter "p2" has the value "quiche", the next document is "pass.ccxml". Otherwise, the next document is "fail.ccxml".

This document includes comment elements whose content may be included in a log element in the response document to aid in debugging.

<?xml version="1.0"?>
<!-- Check if p1 ==  42 and p2 == 'quiche'. --> 
<ircgi> 
  <if-parameter name="p1" value="42">
    <comment>p1 is 42.</comment>
    <if-parameter name="p2" value= "quiche"> 
      <comment>p2 is quiche.</comment>
      <next dest="../pass.ccxml" /> 
    </if-parameter> 
    <comment> p2 is not quiche.</comment>
    <next dest="../fail.ccxml"/>
  </if-parameter>
  <comment>p1 is not 42.</comment>
  <next dest="../fail.ccxml" /> 
</ircgi>

Example 4 - Verifying header presence and value

If the "User-Agent" HTTP header is present but is empty, the next document is "fail.ccxml". If the "User-Agent" header is present and not empty, the next document is "pass.ccxml". If the "User-Agent" header is not present, the next document is "fail.ccxml".

<?xml version="1.0" ?>
<ircgi> 
  <if-header name="User-Agent"> 
    <if-headername="User-Agent" value= ""> 
      <comment>
        User-Agent header present, but empty.
      </comment>
      <next dest="../fail.ccxml" />
    </if-header>
    <comment>
      User-Agent header was supplied and not empty.
    </comment>
    <next dest="../pass.ccxml" />
  </if-header>
  <comment>
    User-Agent header was not supplied.
  </comment>
  <next dest="../fail.ccxml" />
</ircgi>

Example 5 - Setting HTTP response status code

If the parameter "p1" was submitted, the next document is "pass.ccxml". Otherwise, the HTTP response code is set to "404".

<?xml version="1.0"?>
<!-- Send 404 if p1 not present -->
<ircgi>
  <if-parameter name="p1">
    <next dest="../pass.ccxml" /> 
  </if-parameter>
  <next code="404" /> 
</ircgi>

Example 6 - Included and generated result documents

If the parameter "p1" was "include", then parameter "p2" will be checked. If parameter "p2" was "pass", then the response will be the content of the file "pass.ccxml" because the next element's include attribute is true. If parameter "p2" is not "pass", the response will be the content of the file "fail.ccxml" because the next element's include attribute is false.

If parameter "p1" was not "include", the response document will be generated by the ircgi and include a goto to "fail.ccxml" because the include attribute was false, by default. The generated document may contain a log element containing the content of the IRCGI document's comment element.

<?xml version="1.0"?>
<!-- If p1 == 'include', include 'pass.vxml' if p2 == 'pass'. -->
<ircgi>
  <if-parameter name= "p1" value="include"> 
    <if-parameter name="p2" value="pass">
      <next dest="../pass.ccxml" include= "true"/> 
    </if-parameter>
    <next dest="../fail.ccxml" include="true"/>
  </if-parameter>
  <comment>p1 is not 'include'.</comment>
  <next dest="../fail.ccxml" /> 
</ircgi>

Example 7 - Sleeping before returning a response

This example navigates to a document "fail.ccxml" after sleeping for five seconds.

<?xml version="1.0"?>
<ircgi>
  <next dest="../fail.ccxml" sleep="5" /> 
</ircgi>

Example 8 - Using starts-with

This example checks the Content-Type header for a partial match on "multipart/form-data".

The starts-with attribute is used instead of the value attribute since the boundary portion of the value cannot be controlled or predetermined. An example of a Content-Type header value when the encoding is set to "multipart/form-data" follows:

multipart/form-data; boundary=---------------------------7d39216110392
<ircgi>
  <if-header name="Content-Type">
    <if-header name="Content-Type" starts-with="multipart/form-data" 
         ignore-case="true">
      <next dest="../pass.ccxml" />
    </if-header>
    <comment>
      Content-Type header was not multipart/form-data .
    </comment>
    <next dest="../fail.ccxml" />
  </if-header>
  <next dest="../fail.ccxml" />
</ircgi>

Example 9 - Returning the server-calculated epoch

The following example includes a .js document. The .js document includes a single statement that sets a variable to the value of the special variable __EPOCH__. At runtime, the CGI detects the special variable and replaces it with the server-calculated number of seconds since 'the epoch'. This feature is useful in testing to verify the caching behavior of a VoiceXML interpreter by making multiple IRCGI requests and comparing the values of __EPOCH__. If the values differ, the document was fetched from the Web. If not, the document was retrieved from the browser's local cache.

The IRCGI follows:

<ircgi>
  <next sleep="2" dest="../epoch.js" include="true"/>
</ircgi>

The .js document follows:

var epoch = __EPOCH__;

Example 10 - Setting Expires

This example returns the document "cache_me.ccxml" along with an Expires header set to 60 seconds after the CGI is requested.

<ircgi>
  <next dest="../cache_me.ccxml" include="true" expires="60"/>
</ircgi>

Example 11 - Verifying file uploads

If the CGI parameter named "recording" is a valid file upload and its size is equal to the value of the CGI parameter 'recsize' the next document is "pass.ccxml". Otherwise, the next document is "fail.ccxml".

<?xml version="1.0"?>
<!--
Check if upload was of a specified size.
-->
<ircgi>
  <!-- 
    @name represents the upload parameter name
    @size can refer to a static numeric value or, 
      as shown here, to a CGI parameter name
  -->
  <if-upload name="recording" size="recsize">
      <next dest="../pass.ccxml" /> 
  </if-upload>
  <next dest="../fail.ccxml" /> 
</ircgi>

Example 12 - Verifying all CGI parameters

The following IRCGI expects precisely 3 CGI parameters the names and values of which are designated by the contents of the params element referenced by the if-all-params element.

<?xml version="1.0"?>
<!-- Check if submitted parameters are in the set plist1 -->
<ircgi>
  <params id="plist1">
  <param name="p1" value="42"/>
  <param name="p2.dinner.main" value="quiche"/>
  <param name="p3" value="a 1 c"/>
  </params>
  <if-all-params ref="plist1">
      <next dest="../pass.ccxml" /> 
  </if-all-params>
  <next dest="../fail.ccxml" />
</ircgi>

Example 13 - VoiceXML document generation

The following IRCGI generates a VoiceXML document because the attribute isVXML is "true".

<?xml version="1.0"?>
<!-- Generation of VoiceXML document -->
<ircgi>
      <next  isVXML="true" dest="../312.vxml" sleep="10"/> 
</ircgi>

B.5 Usage

For security purposes, transformed IRCGI documents are deployed to an isolated directory, named "cgi-bin" under the assertion directory. Other, non-IRCGI, server-side programs that may be needed are also located in the "cgi-bin" directory.

B.6 Transformation requirements

The source IRCGI documents must be transformed into files that are executable in the test environment, such JSP files. The output files must reside in the "cgi-bin" directory and must have the ".ircgi" file extension. The file extension must be ".ircgi" because this is how other test documents (.txml) will refer to them. The .txml to .vxml transformation process cannot automatically change ".ircgi" ".pl" or ".jsp" because some tests may use ECMAScript expressions to build the reference to the ".ircgi" document.

B.7 Reference XSLT documents

The following XSLT document can be used to transform an IRCGI document to JSP:

<?xml version="1.0"?>
<?xml version="1.0"?>
<!-- Copyright 1998-2010 W3C (MIT, ERCIM, Keio), All Rights Reserved. See http://www.w3.org/Consortium/Legal/. -->
<!-- Transforms an ircgi test file into a Java Server Page.-->
<!-- 
    NOTE: This JSP requires the com.oreilly.servlet package available at http://www.servlets.com/cos/
0    The source code, object code, and documentation in the com.oreilly.servlet package
    (http://www.servlets.com/cos/) is copyright and owned by Jason Hunter.
-->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>

<xsl:template match="/" >
  <xsl:apply-templates />
</xsl:template>

<xsl:template match="ircgi">
  <xsl:call-template name="header" />
  <xsl:call-template name="declarations" />
  <xsl:call-template name="determineResult" />
</xsl:template>

<!--   Official contentType is 'application/ccxml+xml'.
  Change contentType to 'text/xml' to view generated JSP in IE.

   NOTE: The "header" template content below must be on a single line so that whitespace is not
   introduced at the beginning of the resulting XML document. XML parsers will complain. 
   Line breaks are included here for readability in the documentation.
 -->
<xsl:template name="header" ><%@ page language="java" contentType="text/xml" %><%@ page import="java.io.*" %><%@ page import="java.net.*" %><%@ page import="java.util.*" %><%@ page import="com.oreilly.servlet.multipart.*" %></xsl:template>

<!--   Define a Result class to hold the destination, comments, and
  HTTP status code that will be set by 'determineResult' method.
-->
<xsl:template name="declarations"><%!
    
    // Handles server side includes so they can be parsed
    private class JSPIncluder
    {
		void readInput(HttpServletRequest request, String strIncludePath, boolean absolute) throws JspException    
		{
        	URLConnection conn;

        	// Get URL
        	StringBuffer strUrl;
			String strUri;

			if(!absolute){
				strUrl = request.getRequestURL();
        		strUri = strUrl.toString();
        		int nFindSlash = strUri.lastIndexOf("/");
        		if (nFindSlash != -1)
        		{
            		strUri = strUri.substring(0, nFindSlash + 1);              
        		}
        		strUri += strIncludePath;
			 }else{
				strUri = strIncludePath;
			 }
        	// Open connection
        	try
        	{
            	conn = (new URL(strUri)).openConnection();
            	conn.setDoInput(true);
            	conn.setDoOutput(false);
            	conn.connect();
        	}
            catch (Exception e)
            {
                throw new JspException(e.toString());
            }

            // Read in contents
            try
            {
                BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                StringBuffer buff = new StringBuffer();
                char[] chars = new char[2048];
                int nLen;

                while ((nLen = in.read(chars, 0, chars.length)) >= 0)
                {
                    buff.append(chars, 0, nLen);
                }
                m_strBuffer = buff.toString();
                in.close();
            }
            catch (Exception e)
            {
                throw new JspException(e.toString());
            }
        }

        boolean replace(String strFind, String strReplace)
        {
            boolean bFound = false;
            if (m_strBuffer != null && m_strBuffer.length() > 0)
            {
                int a = 0;
                int b = 0;
                while (true)
                {
                    a = m_strBuffer.indexOf(strFind, b);
                    if (a != -1)
                    {
                        m_strBuffer = m_strBuffer.substring(0, a) + strReplace + m_strBuffer.substring(a + strFind.length());
                        b = a + strReplace.length();
                        bFound = true;
                    }
                    else
                    {
                        break;
                    }
                }
            }
            return bFound;
        }
        
        void doOutput(PageContext context) throws JspException
        {
            JspWriter out = context.getOut();
            try
            {
                out.print(m_strBuffer.toString());
            }
            catch (Exception e)
            {
                throw new JspException(e.toString());
            }   
        }
        private String m_strBuffer;
    }
    
    // Handles multipart/form-data 
    private class MultiPartHandler 
    {
        HttpServletRequest request;
        
        public MultiPartHandler(HttpServletRequest req)
        {
            request = req;
        }
        
        public boolean find(String strFind, int nOfSize) throws JspException 
        {            
            MultipartParser parser;
            Part part;
            String strName;
            if((request.getContentType() != null)&&(request.getContentType().startsWith("multipart/form-data")))
            {
                try
                {
                    parser = new MultipartParser(request, request.getContentLength());
                    while ((part = parser.readNextPart()) != null)
                    {
                        strName = part.getName();
                        if(strName.equals(strFind))
                        {
                            if (nOfSize == -1)
                            {
                                return true;
                            }
                            else
                            {
                                if (part.isFile())
                                {
                                    InputStream stream = ((FilePart)part).getInputStream();
                                    if (getSizeOfStream(stream) == nOfSize)
                                    {
                                        return true;
                                    }
                                }
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    throw new JspException(e.toString());
                }
            }
            
            return false;        
         }
         
         private long getSizeOfStream(InputStream stream)
         {
            if (null == stream) return 0;
            
            int nRead = 0;
            int nSize = 0;
            byte[] temp = new byte[1024];
            try 
            {
                while ((nRead = stream.read(temp)) != -1)
                {
                    nSize += nRead;
                }  
            }
            catch (IOException e) {}
            
            return nSize;         
         }
     }
    
  private class Result {
    String dest;
    long sleep = 0;
    boolean expiresHeaderSet = false;
    long expires = 0;
    boolean include = false;
    boolean isVXML = false;
    StringBuffer comments = new StringBuffer();
    int statusCode = 200;
	boolean absolute = false;
  }
  private final String NL = System.getProperty("line.separator");
  private void determineResult(HttpServletRequest request, Result result, MultiPartHandler multipart) throws JspException
  {
    <xsl:apply-templates />
  }
%></xsl:template>

<!--  Create Result object and call 'determineResult' to set its fields.
  Return CCXML document only if HTTP response status code is 200.
  Otherwise, return just the status code.
-->
<xsl:template name="determineResult" ><%
    Result myResult = new Result();
    MultiPartHandler myMultiPart = new MultiPartHandler(request);
    determineResult(request, myResult, myMultiPart);
    response.setStatus(myResult.statusCode);
    
    if (myResult.sleep > 0)
    {
        try
        {
            Thread.sleep(myResult.sleep * 1000);
        }
        catch (InterruptedException e)
        {
            throw new JspException(e.toString());
        }
    }
    
    if (myResult.expiresHeaderSet)
    {
        Date now = new Date();
        long nMillis = now.getTime();
        response.setDateHeader("Expires", nMillis + myResult.expires*1000);
    }
    
    if (myResult.include) 
    {
        Date now = new Date();
        long nMillis = now.getTime();
        String strEpoch = String.valueOf(nMillis);
        JSPIncluder includer = new JSPIncluder();
        includer.readInput(request, myResult.dest, myResult.absolute);
        includer.replace("__EPOCH__", strEpoch);
        includer.doOutput(pageContext);
    }
    else if (myResult.isVXML) 
    	{%><xsl:call-template name="vxml" /><%}
    else
    	{%><xsl:call-template name="ccxml" /><%}%> 
   
</xsl:template>

<xsl:template match="if-parameter" >
  if (<xsl:call-template name="genIfExpr">
        <xsl:with-param name="type" select="'Parameter'" />
      </xsl:call-template>) {
    <xsl:apply-templates />
  }
</xsl:template>

<xsl:template match="if-header" >
  if (<xsl:call-template name="genIfExpr">
        <xsl:with-param name="type" select="'Header'" />
      </xsl:call-template>) {
    <xsl:apply-templates />
  }
</xsl:template>

<xsl:template match="if-all-params" >
  if (<xsl:for-each select="/ircgi/params[@id=current()/@ref]/param">
        <xsl:call-template name="genIfExpr">
          <xsl:with-param name="type" select="'Parameter'" />
        </xsl:call-template>
        <xsl:if test="position() != last()">&&</xsl:if>
      </xsl:for-each>) {
    <xsl:apply-templates />
  }
</xsl:template>

<xsl:template match="if-upload" >
  int nSize = -1;
  <xsl:if test="@size">
    if (null != request.getParameter("<xsl:value-of select='@size'/>"))
    {
      try {
        nSize = Integer.parseInt(request.getParameter("<xsl:value-of select='@size'/>"));
      }
      catch (NumberFormatException e) { }
    }
    else
    {
      try {
        nSize = Integer.parseInt("<xsl:value-of select='@size'/>");
      }
      catch (NumberFormatException e) { }
    }
  </xsl:if>  
  if (multipart.find("<xsl:value-of select="@name"/>", nSize))
  {
    <xsl:apply-templates />
  } 
</xsl:template>

<!--  Generate an expression that determines when the condition of an if-parameter / if-header
  element is true.  The 'type' parameter determines the
  HttpServletRequest method to use to get the value to be checked.
-->
<xsl:template name="genIfExpr" >
  <xsl:param name="type" />
  <xsl:param name="size" />
  <xsl:variable name="method">
    <xsl:choose>
      <xsl:when test="@ignore-case = 'true'" >equalsIgnoreCase</xsl:when>
      <xsl:otherwise>equals</xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <xsl:choose>
    <xsl:when test="@value">
      request.get<xsl:value-of select="$type"/>
        ("<xsl:value-of select="@name"/>") != null &&
      request.get<xsl:value-of select="$type"/>
        ("<xsl:value-of select="@name"/>").<xsl:value-of select="$method"/>
        ("<xsl:value-of select="@value" />")
    </xsl:when>
    <xsl:when test="@starts-with">
       request.get<xsl:value-of select="$type"/>
        ("<xsl:value-of select="@name"/>") != null &&
       request.get<xsl:value-of select="$type"/>
        ("<xsl:value-of select="@name"/>").startsWith("<xsl:value-of select="@starts-with"/>")
    </xsl:when>     
    <xsl:otherwise>
      request.get<xsl:value-of select="$type"/>("<xsl:value-of select="@name"/>") != null 
        || multipart.find("<xsl:value-of select="@name"/>", -1)
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template match="if-method" >
  if (request.getMethod().equalsIgnoreCase("<xsl:value-of select="@type" />")) {
    <xsl:apply-templates />
  }
</xsl:template>

<!--  Disarm double quotes and newline characters from comments, then
  add to result's comment buffer for use later in 'log' element.
-->
<xsl:template match="comment" >
  result.comments.append
    ("<xsl:value-of select="translate(., '"
', '   ')" />".trim());
  result.comments.append(NL);
</xsl:template>

<xsl:template match="next" >
  <xsl:if test="@code" >
    result.statusCode = <xsl:value-of select="@code" />;
  </xsl:if>
  <xsl:if test="@dest" >
      result.dest = "<xsl:value-of select="@dest" />";
  </xsl:if>
  <xsl:if test="@param">
	result.dest = request.getParameter("<xsl:value-of select="@param"/>");
  </xsl:if>
  <xsl:if test="@include = 'true'">
    result.include = true;
  </xsl:if>  
  <xsl:if test="@isVXML = 'true'">
    result.isVXML = true;
  </xsl:if>  
  <xsl:if test="@sleep">
      result.sleep = <xsl:value-of select="@sleep" />;
  </xsl:if>  
  <xsl:if test="@expires">
      result.expiresHeaderSet = true;
      result.expires = <xsl:value-of select="@expires" />;
  </xsl:if>
  <xsl:if test="@absolute">
	result.absolute = <xsl:value-of select="@absolute"/>;
  </xsl:if>
    return;
</xsl:template>

<!--  Generate CCXML document that does a 'goto' to the document
  indicated in myResult.  If comment buffer is not empty, include
  a 'log' element to aid in debugging.
-->

<xsl:template name="ccxml" ><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<ccxml version="1.0" xmlns="http://www.w3.org/2002/09/ccxml">
  <eventprocessor>
    <transition event="ccxml.loaded">
      <% String comments = myResult.comments.toString();
        if (comments.length()>0) {%>
        <log>]]>
        <xsl:text disable-output-escaping="yes">
          <![CDATA[<%= comments %>]]>
        </xsl:text><![CDATA[
        </log><%}%>
        <fetch next="'<%= myResult.dest %>'"/>
    </transition>
  <transition event="fetch.done">
    <goto fetchid="event$.fetchid"/>
  </transition>
</eventprocessor>
</ccxml> ]]>
</xsl:template>

<!--  Generate VoiceXML document that does a 'goto' to the document
  indicated in myResult.  If comment buffer is not empty, include
  a 'log' element to aid in debugging.
-->

<xsl:template name="vxml" ><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.1" xmlns="http://www.w3.org/2001/vxml">
  <form>
    <block><% String comments = myResult.comments.toString();
   if (comments.length()>0) {%>
      <log>]]>
        <xsl:text disable-output-escaping="yes">
          <![CDATA[<%= comments %>]]>
        </xsl:text><![CDATA[
      </log><%}%>
      <goto next="<%= myResult.dest %>"/>
    </block>
  </form>
</vxml> ]]>
</xsl:template>

</xsl:stylesheet>

B.8 Test developer requirements

The directory convention requires test developers to ensure that paths from and to other test documents follow the convention.

The following example contains a reference to an IRCGI document from a VoiceXML document:

<goto next="cgi-bin/ua.ircgi" />

The following example contains a reference to a CCXML document from an IRCGI document:

<next dest="../pass.ccxml"/>

B.9 Web server administrator requirements

Given the directory convention, Web server administrators must do the following:

The following example configures Tomcat to run transformed files with a .ircgi extension as a JSP:

<servlet-mapping>
  <servlet-name>jsp</servlet-name>
  <url-pattern>*.ircgi</url-pattern>
</servlet-mapping>

Appendix C - Downloading tests

The "ccxml10-ir-20110412.zip" archive contains several resources. This report is composed of a number of Jumbo tests to verify many assertions in a single testing document (see Appendix A.6 for details on Jumbo tests). The Jumbo tests are organised into folders where the folder name corresponds to the test ID. In addition the archive includes the following:

C.1 The Manifest

The "manifest.xml" is a file containing the complete information about the Jumbo tests that comprise the CCXML Implementation Report. The structure of the Manifest presents a root element called <tests> ; this is the container of all the Jumbo tests. Every Jumbo test is represented by a <test> element containing other elements, such as <assert> to declare test assertions to be tested by the Jumbo test, <instruction> to give instructions to the testers, <start> to declare the initial .txml document, and <dep> to declare other dependent documents. <assert> can contain CDATA that represents the description of the test assertion, but it is currently empty (that information is already present in the Assertion Manifest for each assertion, see below). The <start> element references the main test file and may optionally be followed by one or more <dep> elements that identifies other resources useful to complete the test case. Here's the DTD for the Manifest:

<!ELEMENT assert (#PCDATA)>
<!ATTLIST assert
    id CDATA #REQUIRED
    spec CDATA #IMPLIED
    optional (true | false) #IMPLIED
    manual (true | false) #IMPLIED
    teststartuptype (alerting | connected | noconnection) #IMPLIED
>
<!ELEMENT dep EMPTY>
<!ATTLIST dep
    uri CDATA #REQUIRED
    type CDATA #IMPLIED
>
<!ELEMENT start EMPTY>
<!ATTLIST start
    uri CDATA #REQUIRED
    type CDATA #IMPLIED
>

<!ELEMENT instruction (#PCDATA)>

<!ELEMENT test ((assert*, instruction*)+, start, dep*)>
<!ATTLIST test
    id CDATA #REQUIRED
    spec CDATA #REQUIRED
    manual (true | false) "false"
    teststartuptype (alerting | connected | noconnection) #REQUIRED
>
<!ELEMENT tests (test+)>

Jumbo test typology is defined by several attributes on the <test> element. These attributes allow for a more complete identification of the nature of the current assertion and an idea of related tests structure.

<start> and <dep> elements are characterized by the following attributes:

For instance here’s a fragment of the manifest.xml document:

<?xml version="1.0"?>
<tests>
[…]
  <test id="10_2_2_A" teststartuptype="alerting" spec="10.2.2">
    <assert id="283"/>
    <assert id="285"/>
    <start uri="10_2_2_A/10_2_2_A.txml"/>
    <dep uri="10_2_2_A/test.vxml"/>
  </test>
[…]
</tests>

C.2 The Assertion Manifest

The "manifest.assert.xml" is a file containing the complete information about test assertions included in the Jumbo tests. The structure of the Assertion Manifest presents a root element called <tests> ; this is the container of all the Test Assertions. Every Test Assertion is represented by a <test> element containing a single <assert> element to give specific information on the Test Assertion. <assert> must contain CDATA that represents the description of the test assertion. Here's the DTD for the Assertion Manifest:

<!ELEMENT assert (#PCDATA)>
<!ATTLIST assert
    id CDATA #REQUIRED
    spec CDATA #REQUIRED
    optional (true | false) "false"
    manual (true | false) "false"
    teststartuptype (alerting | connected | noconnection) #IMPLIED
>
<!ELEMENT test (assert)>
<!ELEMENT tests (test+)>

The Test Assertion is defined by several attributes on the <assertion> element. These attributes allow for a more complete identification of the nature of the current test assertion.

For instance here’s a fragment of the manifest.xml document:

<?xml version="1.0"?>
<tests>
[…]
  <test>
    <assert id="606" optional="false" manual="false" spec="6.2.1">
      <![CDATA[The <ccxml> can designate the CCXML namespace. 
      This can be achieved by declaring an xmlns attribute or an attribute 
      with an "xmlns" prefix.]]>
    </assert>
  </test>
[…]
</tests>

C.3 The Report Submission Template

The "ccxml10-ir-results-template.xml" report template has to be filled by the company following the rules described in Section 3. An excerpt of the Template is shown below:

<system-report name="YOUR-SYSTEM-NAME-HERE">
<testimonial> YOUR-WELL-FORMED-TESTIMOMIAL-CONTENT-HERE</testimonial>
<assert id="Id1" res="pass|fail|not-impl">OPTIONAL-NOTES-HERE</assert>
        [...]
<assert id="Idn" res="pass|fail|not-impl">OPTIONAL-NOTES-HERE</assert>
</system-report>

C.4 The Stylesheet

A specific stylesheet transforms the meta markup language used to write the tests into valid CCXML 1.0 documents (the stylesheet is described in Appendix A.5). The stylesheet tranformation for dynamic CCXML/VoiceXML documents is described in Appendix B.7.

Appendix D - Acknowledgements

The CCXML 1.0 Implementation Report includes over 1200 assertions with 565 actually implemented in this Report. The Voice Browser Working Group would like to acknowledge the contributions of several individuals for authoring and reviewing assertions and for working on the test suite development. Without their help this activity would have been impossible:

The Voice Browser Working Group would also like to acknowledge the following contributors:

Appendix E - Changes from the previous version

This Implementation Report was modified based on the comments sent to the Voice Browser public list as follows. Each ISSUE is linked to the modified test, where a comment is present to clarify all the assertions changed.

12 April 2011
15 July 2010