///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2018 Ericsson Telecom AB
//
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v2.0
// which accompanies this distribution, and is available at
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.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";
}
