///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2016 Ericsson Telecom AB
//
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// which accompanies this distribution, and is available at
// http://www.eclipse.org/legal/epl-v10.html
///////////////////////////////////////////////////////////////////////////////
//
//  File:          http_ntaforum_org_2011_harness.ttcn
//  Description:
//  References:
//  Rev:           R2B
//  Prodnr:        CNL 113 776
//  Updated:       Sun Jan  6 13:17:58 2013
//  Contact:       http://ttcn.ericsson.se
//
////////////////////////////////////////////////////////////////////////////////
//
//	Generated from file(s):
//
//	- harness.xsd
//			/* xml version = "1.0" encoding = "UTF-8" */
//			/* targetnamespace = "http://ntaforum.org/2011/harness" */
//
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//
//
//NTAF-0002: Tool Automation Harness
//
//
////////////////////////////////////////////////////////////////////////////////


module http_ntaforum_org_2011_harness {


import from XSD all;


import from http_www_w3_org_XML_1998_namespace all;


type Harness_1 Harness
  with {
  variant "name as uncapitalized";
  variant "element";
};


type record Harness_1
{
  XSD.String name,
  record length(1 .. infinity) of SessionMode supportedMode_list
}
with {
  variant "name as 'harness'";
  variant (name) "attribute";
  variant (supportedMode_list) "untagged";
  variant (supportedMode_list[-]) "name as 'supportedMode'";
};


/* Information about a certain harness including descriptions of the
harness itself as well as the actions, events, and nested harnesses it
supports. */
type record Query_harness
{
  Namespace harness,
  Lang lang,
  XSD.String label_  optional,//not optional in XSD!!!!
  XSD.String tooltip optional,
  XSD.String description optional,
  XSD.AnyURI helpURI optional,
  Namespace supercedes optional,
  XSD.String author optional,//not optional in XSD!!!   
  record of record {
    ActionName name,
    XSD.String label_,
    XSD.String tooltip optional,
    XSD.String description optional,
    XSD.AnyURI helpURI optional,
    record of ParameterDecl parameter_list,
    record of XmlParameterDecl xmlParameter_list,
    record of FileDecl file_list,
    record of RequestGroupDecl group_list,
    ResponseDecl responseDecl optional
  } actionDecl_list,
  record of record {
    XSD.Name name,
    record of ResponseItemDecl item_list,
    record of ResponseXmlItemDecl xmlItem_list,
    record of FileItemDecl fileItem_list,
    record of ResponseGroupDecl group_list,
    XSD.String description
  } eventDecl_list,
  record of Namespace subharness_list
}
with {
  variant "name as 'query-harness'";
  variant "element";
  variant (harness) "attribute";
  variant (lang) "attribute";
  variant (lang) "namespace as 'http://www.w3.org/XML/1998/namespace'" "prefix 'xml'"; //added
  variant (label_) "name as 'label'";
  variant (actionDecl_list) "untagged";
  variant (actionDecl_list[-]) "name as 'actionDecl'";
  variant (actionDecl_list[-].name) "attribute";
  variant (actionDecl_list[-].label_) "name as 'label'";
  variant (actionDecl_list[-].parameter_list) "untagged";
  variant (actionDecl_list[-].parameter_list[-]) "name as 'parameter'";
  variant (actionDecl_list[-].xmlParameter_list) "untagged";
  variant (actionDecl_list[-].xmlParameter_list[-]) "name as 'xmlParameter'";
  variant (actionDecl_list[-].file_list) "untagged";
  variant (actionDecl_list[-].file_list[-]) "name as 'file'";
  variant (actionDecl_list[-].group_list) "untagged";
  variant (actionDecl_list[-].group_list[-]) "name as 'group'";
  variant (eventDecl_list) "untagged";
  variant (eventDecl_list[-]) "name as 'eventDecl'";
  variant (eventDecl_list[-].name) "attribute";
  variant (eventDecl_list[-].item_list) "untagged";
  variant (eventDecl_list[-].item_list[-]) "name as 'item'";
  variant (eventDecl_list[-].xmlItem_list) "untagged";
  variant (eventDecl_list[-].xmlItem_list[-]) "name as 'xmlItem'";
  variant (eventDecl_list[-].fileItem_list) "untagged";
  variant (eventDecl_list[-].fileItem_list[-]) "name as 'fileItem'";
  variant (eventDecl_list[-].group_list) "untagged";
  variant (eventDecl_list[-].group_list[-]) "name as 'group'";
  variant (subharness_list) "untagged";
  variant (subharness_list[-]) "name as 'subharness'";  //added
};


/* A request to open a new session using a specified harness and a set
of parameters and other information consistent with the contract defined in query-
harness */
type record Open
{
  Namespace harness,
  Lang lang optional,
  SessionMode mode,
  XSD.Boolean reportUserActivity optional,
  Context context optional,
  record of RequestParameter parameter_list,
  record of RequestXmlParameter xmlParameter_list,
  record of RequestFile file_list,
  record of RequestGroup group_list,
  XSD.DateTime timestamp optional,
  XSD.String activationRef
}
with {
  variant "name as uncapitalized";
  variant "element";
  variant (harness) "attribute";
  variant (lang) "attribute";
  variant (lang) "namespace as 'http://www.w3.org/XML/1998/namespace'" "prefix 'xml'";
  variant (mode) "attribute";
  variant (reportUserActivity) "defaultForEmpty as 'true'";
  variant (reportUserActivity) "attribute";
  variant (parameter_list) "untagged";
  variant (parameter_list[-]) "name as 'parameter'";
  variant (xmlParameter_list) "untagged";
  variant (xmlParameter_list[-]) "name as 'xmlParameter'";
  variant (file_list) "untagged";
  variant (file_list[-]) "name as 'file'";
  variant (group_list) "untagged";
  variant (group_list[-]) "name as 'group'";
};


/* A request to perform a certain action within the context of a
session previously established using open, along with parameters and other information affecting
the behavior of this request, consistent with the contract defined by the corresponding query-
harness. */
type record Request
{
  XSD.Name session,
  Context context optional,
  record of RequestParameter parameter_list,
  record of RequestXmlParameter xmlParameter_list,
  record of RequestFile file_list,
  record of RequestGroup group_list,
  XSD.DateTime timestamp optional,
  Action action_
}
with {
  variant "name as uncapitalized";
  variant "element";
  variant (session) "attribute";
  variant (parameter_list) "untagged";
  variant (parameter_list[-]) "name as 'parameter'";
  variant (xmlParameter_list) "untagged";
  variant (xmlParameter_list[-]) "name as 'xmlParameter'";
  variant (file_list) "untagged";
  variant (file_list[-]) "name as 'file'";
  variant (group_list) "untagged";
  variant (group_list[-]) "name as 'group'";
  variant (action_) "name as 'action'";
};


/* A request to cancel an action previously requested using a
request */
type record Cancel
{
  XSD.String requestId,
  XSD.Name session,
  XSD.DateTime timestamp optional
}
with {
  variant "name as uncapitalized";
  variant "element";
  variant (requestId) "attribute";
  variant (session) "attribute";
};


type record Progress
{
  XSD.String requestId,
  XSD.Name session,
  XSD.Int totalWork,
  XSD.Int remainingWork,
  XSD.String status optional,
  XSD.Duration timeRemaining optional,
  XSD.DateTime timestamp optional
}
with {
  variant "name as uncapitalized";
  variant "element";
  variant (requestId) "attribute";
  variant (session) "attribute";
};


/* A response returned corresponding to a request previously made.
The response, if populated, will conform to the details defined in the contract established via
query-harness for the action from the request. */
type record Response
{
  Lang lang optional,
  XSD.String requestId optional,
  XSD.Name session,
  Result result,
  XSD.String message_ optional,
  XSD.Float duration optional,
  record of ResponseItem item_list,
  record of ResponseXmlItem xmlItem_list,
  record of FileItem file_list,
  record of ResponseGroup group_list,
  XSD.DateTime timestamp optional
}
with {
  variant "name as uncapitalized";
  variant "element";
  variant (lang) "attribute";
  variant (lang) "namespace as 'http://www.w3.org/XML/1998/namespace'" "prefix 'xml'";
  variant (requestId) "attribute";
  variant (session) "attribute";
  variant (message_) "name as 'message'";
  variant (item_list) "untagged";
  variant (item_list[-]) "name as 'item'";
  variant (xmlItem_list) "untagged";
  variant (xmlItem_list[-]) "name as 'xmlItem'";
  variant (file_list) "untagged";
  variant (file_list[-]) "name as 'file'";
  variant (group_list) "untagged";
  variant (group_list[-]) "name as 'group'";
};


/* An autonomous message issued by the provider of a harness to the
originator of one of its sessions informing it about some event that has occurred. It may also
contain additional information that must conform to the corresponding information in the query-
harness for the corresponding event. */
type record Event
{
  Namespace harness,
  Lang lang optional,
  XSD.Name name,
  XSD.Name session,
  XSD.DateTime timestamp,
  record of ResponseItem item_list,
  record of ResponseXmlItem xmlItem_list,
  record of FileItem file_list,
  record of ResponseGroup group_list
}
with {
  variant "name as uncapitalized";
  variant "element";
  variant (harness) "attribute";
  variant (lang) "attribute";
  variant (lang) "namespace as 'http://www.w3.org/XML/1998/namespace'" "prefix 'xml'";
  variant (name) "attribute";
  variant (session) "attribute";
  variant (item_list) "untagged";
  variant (item_list[-]) "name as 'item'";
  variant (xmlItem_list) "untagged";
  variant (xmlItem_list[-]) "name as 'xmlItem'";
  variant (file_list) "untagged";
  variant (file_list[-]) "name as 'file'";
  variant (group_list) "untagged";
  variant (group_list[-]) "name as 'group'";
};


/* A request to close a session previously opened using
open. */
type record Close
{
  XSD.Name session,
  XSD.DateTime timestamp optional
}
with {
  variant "name as uncapitalized";
  variant "element";
  variant (session) "attribute";
};


/* A notification from the provider that the session has
closed */
type record Notify_close
{
  XSD.Name session,
  XSD.DateTime timestamp optional
}
with {
  variant "name as 'notify-close'";
  variant "element";
  variant (session) "attribute";
};


/* Notification of information about an action that was performed and
the response it produced. */
type record Notify_action
{
  Lang lang optional,
  XSD.Name session,
  Action action_,
  XSD.DateTime started,
  Context context optional,
  record of RequestParameter requestParameter_list,
  record of RequestXmlParameter requestXmlParameter_list,
  record of RequestFile requestFile_list,
  record of RequestGroup requestGroup_list,
  Result result,
  XSD.String message_ optional,
  XSD.Float duration optional,
  record of ResponseItem responseItem_list,
  record of ResponseXmlItem responseXmlItem_list,
  record of FileItem responseFile_list,
  record of ResponseGroup responseGroup_list,
  XSD.DateTime timestamp optional
}
with {
  variant "name as 'notify-action'";
  variant "element";
  variant (lang) "attribute";
  variant (lang) "namespace as 'http://www.w3.org/XML/1998/namespace'" "prefix 'xml'";
  variant (session) "attribute";
  variant (action_) "name as 'action'";
  variant (requestParameter_list) "untagged";
  variant (requestParameter_list[-]) "name as 'requestParameter'";
  variant (requestXmlParameter_list) "untagged";
  variant (requestXmlParameter_list[-]) "name as 'requestXmlParameter'";
  variant (requestFile_list) "untagged";
  variant (requestFile_list[-]) "name as 'requestFile'";
  variant (requestGroup_list) "untagged";
  variant (requestGroup_list[-]) "name as 'requestGroup'";
  variant (message_) "name as 'message'";
  variant (responseItem_list) "untagged";
  variant (responseItem_list[-]) "name as 'responseItem'";
  variant (responseXmlItem_list) "untagged";
  variant (responseXmlItem_list[-]) "name as 'responseXmlItem'";
  variant (responseFile_list) "untagged";
  variant (responseFile_list[-]) "name as 'responseFile'";
  variant (responseGroup_list) "untagged";
  variant (responseGroup_list[-]) "name as 'responseGroup'";
};


/* The remainder of the file contains definitions for classes referenced above */


/* Information about a named set of actions and events that may
describe a harness */
type record HarnessDecl
{
  Lang lang,
  XSD.String label_,
  XSD.String tooltip optional,
  XSD.String description optional,
  XSD.AnyURI helpURI optional,
  Namespace supercedes optional,
  XSD.String author,
  record of record {
    ActionName name,
    XSD.String label_,
    XSD.String tooltip optional,
    XSD.String description optional,
    XSD.AnyURI helpURI optional,
    record of ParameterDecl parameter_list,
    record of XmlParameterDecl xmlParameter_list,
    record of FileDecl file_list,
    record of RequestGroupDecl group_list,
    ResponseDecl responseDecl optional
  } actionDecl_list,
  record of record {
    XSD.Name name,
    record of ResponseItemDecl item_list,
    record of ResponseXmlItemDecl xmlItem_list,
    record of FileItemDecl fileItem_list,
    record of ResponseGroupDecl group_list,
    XSD.String description
  } eventDecl_list
}
with {
  variant "name as uncapitalized";
  variant (lang) "attribute";
  variant (lang) "namespace as 'http://www.w3.org/XML/1998/namespace'" "prefix 'xml'";
  variant (label_) "name as 'label'";
  variant (actionDecl_list) "untagged";
  variant (actionDecl_list[-]) "name as 'actionDecl'";
  variant (actionDecl_list[-].name) "attribute";
  variant (actionDecl_list[-].label_) "name as 'label'";
  variant (actionDecl_list[-].parameter_list) "untagged";
  variant (actionDecl_list[-].parameter_list[-]) "name as 'parameter'";
  variant (actionDecl_list[-].xmlParameter_list) "untagged";
  variant (actionDecl_list[-].xmlParameter_list[-]) "name as 'xmlParameter'";
  variant (actionDecl_list[-].file_list) "untagged";
  variant (actionDecl_list[-].file_list[-]) "name as 'file'";
  variant (actionDecl_list[-].group_list) "untagged";
  variant (actionDecl_list[-].group_list[-]) "name as 'group'";
  variant (eventDecl_list) "untagged";
  variant (eventDecl_list[-]) "name as 'eventDecl'";
  variant (eventDecl_list[-].name) "attribute";
  variant (eventDecl_list[-].item_list) "untagged";
  variant (eventDecl_list[-].item_list[-]) "name as 'item'";
  variant (eventDecl_list[-].xmlItem_list) "untagged";
  variant (eventDecl_list[-].xmlItem_list[-]) "name as 'xmlItem'";
  variant (eventDecl_list[-].fileItem_list) "untagged";
  variant (eventDecl_list[-].fileItem_list[-]) "name as 'fileItem'";
  variant (eventDecl_list[-].group_list) "untagged";
  variant (eventDecl_list[-].group_list[-]) "name as 'group'";
};


/* A declaration of the information that will be returned in response
to a request for a given action supported by the harness (or harness including support for the
given sub) */
type record ResponseDecl
{
  record of ResponseItemDecl item_list,
  record of ResponseXmlItemDecl xmlItem_list,
  record of FileItemDecl fileItem_list,
  record of ResponseGroupDecl group_list
}
with {
  variant "name as uncapitalized";
  variant (item_list) "untagged";
  variant (item_list[-]) "name as 'item'";
  variant (xmlItem_list) "untagged";
  variant (xmlItem_list[-]) "name as 'xmlItem'";
  variant (fileItem_list) "untagged";
  variant (fileItem_list[-]) "name as 'fileItem'";
  variant (group_list) "untagged";
  variant (group_list[-]) "name as 'group'";
};


/* Information that is included along with a request that is made in
the context of a session using a given harness. This information needs to conform to the
contract laid out in the query-harness for the corresponding action. */
type record RequestType
{
  Context context optional,
  record of RequestParameter parameter_list,
  record of RequestXmlParameter xmlParameter_list,
  record of RequestFile file_list,
  record of RequestGroup group_list
}
with {
  variant "name as uncapitalized";
  variant (parameter_list) "untagged";
  variant (parameter_list[-]) "name as 'parameter'";
  variant (xmlParameter_list) "untagged";
  variant (xmlParameter_list[-]) "name as 'xmlParameter'";
  variant (file_list) "untagged";
  variant (file_list[-]) "name as 'file'";
  variant (group_list) "untagged";
  variant (group_list[-]) "name as 'group'";
};


/* Declaration of the information that may be used to describe a
certain parameter associated with a certain action declaration on a certain harness */
type record ParameterDecl
{
  ActionName name,
  XSD.String label_,
  XSD.String tooltip optional,
  XSD.String description optional,
  XSD.AnyURI helpURI optional,
  XSD.Boolean mandatory optional,
  DataType datatype optional,
  XSD.String units optional,
  XSD.String default_ optional,
  XSD.Boolean masked optional,
  XSD.Boolean isMultiline optional,
  record of AllowedValueDecl allowedValue_list,
  AllowedCountDecl allowedLength optional,
  AllowedCountDecl allowedCount optional,
  record of XSD.String allowedPattern_list,
  record of AllowedRangeDecl allowedRange_list,
  EnablementValueDecl enablementValue optional
}
with {
  variant "name as uncapitalized";
  variant (name) "attribute";
  variant (label_) "name as 'label'";
  variant (mandatory) "defaultForEmpty as 'true'";
  variant (datatype) "defaultForEmpty as 'string'";
  variant (default_) "name as 'default'";
  variant (masked) "defaultForEmpty as 'false'";
  variant (isMultiline) "defaultForEmpty as 'false'";
  variant (allowedValue_list) "untagged";
  variant (allowedValue_list[-]) "name as 'allowedValue'";
  variant (allowedPattern_list) "untagged";
  variant (allowedPattern_list[-]) "name as 'allowedPattern'";
  variant (allowedRange_list) "untagged";
  variant (allowedRange_list[-]) "name as 'allowedRange'";
};


/* Declaration of the information that may be used to describe a
certain XML parameter -- i.e., a document fragment that may be included as part of a request to
perform a given action */
type record XmlParameterDecl
{
  ActionName name,
  XSD.String label_,
  XSD.String tooltip optional,
  XSD.String description optional,
  XSD.AnyURI helpURI optional,
  XSD.Boolean mandatory optional,
  XSD.Name element,
  XSD.String xmlNamespace,
  EnablementValueDecl enablementValue optional
}
with {
  variant "name as uncapitalized";
  variant (name) "attribute";
  variant (label_) "name as 'label'";
  variant (mandatory) "defaultForEmpty as 'true'";
};


/* Declaration of the information that may be used to describe a file
that may be */
/* " */
/* attached */
/* " */
/* to the corresponding action request */
type record FileDecl
{
  ActionName name,
  XSD.String label_,
  XSD.String tooltip optional,
  XSD.String description optional,
  XSD.AnyURI helpURI optional,
  XSD.Boolean mandatory optional,
  AllowedCountDecl allowedCount optional,
  record of XSD.String allowedFileExtension_list,
  EnablementValueDecl enablementValue optional
}
with {
  variant "name as uncapitalized";
  variant (name) "attribute";
  variant (label_) "name as 'label'";
  variant (mandatory) "defaultForEmpty as 'true'";
  variant (allowedFileExtension_list) "untagged";
  variant (allowedFileExtension_list[-]) "name as 'allowedFileExtension'";
};


type record AllowedValueDecl
{
  XSD.String label_ optional,
  XSD.String base
}
with {
  variant "name as uncapitalized";
  variant (label_) "name as 'label'";
  variant (label_) "attribute";
  variant (base) "untagged";
};


type record AllowedRangeDecl
{ 
  //XSD.Decimal min optional, specifying the nr. of fractional digits is not supported
  //XSD.Decimal max optional
  XSD.String  min optional,
  XSD.String  max optional 

}
with {
  variant "name as uncapitalized";
};


type record AllowedCountDecl
{
  XSD.Int min optional,
  XSD.Int max optional
}
with {
  variant "name as uncapitalized";
};


type record EnablementValueDecl
{
  XSD.Name parameter,
  XSD.String value_,
  EnableOnType enableOn
}
with {
  variant "name as uncapitalized";
  variant (value_) "name as 'value'";
};


/* Declaration of a named group of parameters that may be included in
a request for a certain action */
type record RequestGroupDecl
{
  ActionName name,
  XSD.String label_,
  XSD.String tooltip optional,
  XSD.String description optional,
  XSD.AnyURI helpURI optional,
  XSD.Boolean mandatory optional,
  AllowedCountDecl allowedCount optional,
  XSD.Name parameterKeyName optional,
  record of ParameterDecl parameter_list,
  record of RequestGroupDecl group_list
}
with {
  variant "name as uncapitalized";
  variant (name) "attribute";
  variant (label_) "name as 'label'";
  variant (mandatory) "defaultForEmpty as 'true'";
  variant (parameter_list) "untagged";
  variant (parameter_list[-]) "name as 'parameter'";
  variant (group_list) "untagged";
  variant (group_list[-]) "name as 'group'";
};


/* Declaration of a certain specific item of information that may be
returned in the response to a certain action */
type record ResponseItemDecl
{
  ActionName name,
  XSD.String label_,
  XSD.String tooltip optional,
  XSD.String description optional,
  XSD.AnyURI helpURI optional,
  XSD.Boolean mandatory optional,
  XSD.String default_ optional,
  DataType datatype optional,
  XSD.String units optional,
  XSD.Boolean masked optional,
  XSD.Boolean isMultiline optional,
  record of AllowedValueDecl allowedValue_list,
  AllowedCountDecl allowedCount optional
}
with {
  variant "name as uncapitalized";
  variant (name) "attribute";
  variant (label_) "name as 'label'";
  variant (mandatory) "defaultForEmpty as 'true'";
  variant (default_) "name as 'default'";
  variant (datatype) "defaultForEmpty as 'string'";
  variant (masked) "defaultForEmpty as 'false'";
  variant (isMultiline) "defaultForEmpty as 'false'";
  variant (allowedValue_list) "untagged";
  variant (allowedValue_list[-]) "name as 'allowedValue'";
};


/* Declaration of a certain named XML document fragment that may be
returned in the response to a certain action */
type record ResponseXmlItemDecl
{
  ActionName name,
  XSD.String label_,
  XSD.String tooltip optional,
  XSD.String description optional,
  XSD.AnyURI helpURI optional,
  XSD.Boolean mandatory optional,
  XSD.Name element,
  XSD.String xmlNamespace
}
with {
  variant "name as uncapitalized";
  variant (name) "attribute";
  variant (label_) "name as 'label'";
  variant (mandatory) "defaultForEmpty as 'true'";
};


/* Declaration of a certain named file that may be returned in the
response to a certain action */
type record FileItemDecl
{
  ActionName name,
  XSD.String label_,
  XSD.String tooltip optional,
  XSD.String description optional,
  XSD.AnyURI helpURI optional,
  XSD.Boolean mandatory optional,
  AllowedCountDecl allowedCount optional
}
with {
  variant "name as uncapitalized";
  variant (name) "attribute";
  variant (label_) "name as 'label'";
  variant (mandatory) "defaultForEmpty as 'true'";
};


/* Declaration of a certain named group of items that may be returned
in the response to a certain action */
type record ResponseGroupDecl
{
  ActionName name,
  XSD.String label_,  //not optional !!!
  XSD.String tooltip optional,
  XSD.String description optional,
  XSD.AnyURI helpURI optional,
  XSD.Boolean mandatory optional,
  AllowedCountDecl allowedCount optional,
  XSD.Name itemKeyName optional,
  record of ResponseItemDecl item_list,
  record of ResponseGroupDecl group_list
}
with {
  variant "name as uncapitalized";
  variant (name) "attribute";
  variant (label_) "name as 'label'";
  variant (mandatory) "defaultForEmpty as 'true'";
  variant (item_list) "untagged";
  variant (item_list[-]) "name as 'item'";
  variant (group_list) "untagged";
  variant (group_list[-]) "name as 'group'";
};


type record ResponseItem
{
  XSD.Name name,
  XSD.String base
}
with {
  variant "name as uncapitalized";
  variant (name) "attribute";
  variant (base) "untagged";
};


type record FileItem
{
  XSD.Name name,
  XSD.String filename
}
with {
  variant "name as uncapitalized";
  variant (name) "attribute";
};


type record ResponseXmlItem
{
  XSD.Name name,
  XSD.String elem
}
with {
  variant "name as uncapitalized";
  variant (name) "attribute";
  variant (elem) "anyElement";
};


type record ResponseGroup
{
  XSD.Name name,
  record of ResponseItem item_list,
  record of ResponseGroup group_list
}
with {
  variant "name as uncapitalized";
  variant (name) "attribute";
  variant (item_list) "untagged";
  variant (item_list[-]) "name as 'item'";
  variant (group_list) "untagged";
  variant (group_list[-]) "name as 'group'";
};


type record Action
{
  Namespace harness,
  ActionName base
}
with {
  variant "name as uncapitalized";
  variant (harness) "attribute";
  variant (base) "untagged";
};


type record Context
{
  Jid entity optional,
  XSD.String harness optional,
  XSD.String requestId optional,
  XSD.Name session optional,
  record {
    record of XSD.String elem_list
  } details optional,
  Context context optional
}
with {
  variant "name as uncapitalized";
  variant (entity) "attribute";
  variant (harness) "attribute";
  variant (requestId) "attribute";
  variant (session) "attribute";
  variant (details.elem_list) "untagged";
  variant (details.elem_list[-]) "anyElement";
};


type record RequestParameter
{
  XSD.Name name,
  XSD.String base
}
with {
  variant "name as uncapitalized";
  variant (name) "attribute";
  variant (base) "untagged";
};


type record RequestXmlParameter
{
  XSD.Name name,
  XSD.String elem
}
with {
  variant "name as uncapitalized";
  variant (name) "attribute";
  variant (elem) "anyElement";
};


type record RequestFile
{
  XSD.Name name,
  XSD.String filename
}
with {
  variant "name as uncapitalized";
  variant (name) "attribute";
};


type record RequestGroup
{
  XSD.Name name,
  record of RequestParameter parameter_list,
  record of RequestGroup group_list
}
with {
  variant "name as uncapitalized";
  variant (name) "attribute";
  variant (parameter_list) "untagged";
  variant (parameter_list[-]) "name as 'parameter'";
  variant (group_list) "untagged";
  variant (group_list[-]) "name as 'group'";
};


type enumerated EnableOnType
{
  equal,
  not_equal,
  pattern_match
}
with {
  variant "name as uncapitalized";
};


type enumerated SessionMode
{
  invisible_and_automated,
  visible_and_automated,
  visible_and_interactive
}
with {
  variant "name as uncapitalized";
};


type enumerated Result
{
  abort,
  fail_,
  pass_,
  pending
}
with {
  variant "text 'fail_' as 'fail'";
  variant "text 'pass_' as 'pass'";
  variant "name as uncapitalized";
};


type enumerated DataType
{
  anyURI,
  boolean_,
  dateTime,
  decimal,
  integer_,
  string
}
with {
  variant "text 'boolean_' as 'boolean'";
  variant "text 'integer_' as 'integer'";
  variant "name as uncapitalized";
};


type XSD.String Jid
  with {
  variant "name as uncapitalized";
};


type XSD.AnyURI Namespace
  with {
  variant "name as uncapitalized";
};


type XSD.Name ActionName
  with {
  variant "name as uncapitalized";
};


type record NamedElementDeclWithMandatory
{
  ActionName name,
  XSD.String label_,
  XSD.String tooltip optional,
  XSD.String description optional,
  XSD.AnyURI helpURI optional,
  XSD.Boolean mandatory optional
}
with {
  variant "name as uncapitalized";
  variant (name) "attribute";
  variant (label_) "name as 'label'";
  variant (mandatory) "defaultForEmpty as 'true'";
};


type record NamedElementDecl
{
  ActionName name,
  XSD.String label_,
  XSD.String tooltip optional,
  XSD.String description optional,
  XSD.AnyURI helpURI optional
}
with {
  variant "name as uncapitalized";
  variant (name) "attribute";
  variant (label_) "name as 'label'";
};


type record ElementDecl
{
  XSD.String label_,
  XSD.String tooltip optional,
  XSD.String description optional,
  XSD.AnyURI helpURI optional
}
with {
  variant "name as uncapitalized";
  variant (label_) "name as 'label'";
};


}
with {
  encode "XML";
  variant "namespace as 'http://ntaforum.org/2011/harness' prefix 'h'";
  variant "controlNamespace 'http://www.w3.org/2001/XMLSchema-instance' prefix 'xsi'";
  variant "elementFormQualified";
}
