///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2019 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_registry.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):
//
//	- registry.xsd
//			/* xml version = "1.0" encoding = "UTF-8" */
//			/* targetnamespace = "http://ntaforum.org/2011/registry" */
//
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
//
//
//NTAF-0001: Tool Registration, Discovery and Activation
//
//
////////////////////////////////////////////////////////////////////////////////


module http_ntaforum_org_2011_registry {


import from XSD all;


import from http_www_w3_org_XML_1998_namespace all;


import from http_ntaforum_org_2011_harness all;


type record Entry
{
  XSD.AnyURI tooltype,
  XSD.String version,
  record of Harness harness_list,
  record length(1 .. infinity) of record {
    Lang lang,
    XSD.String vendor,
    XSD.String name,
    XSD.String description,
    XSD.AnyURI helpUri  
  } documentation_list,
  XSD.DateTime published,
  record {
    XSD.String workspaceID,
    record of XSD.String ipv4_list,
    record of XSD.String ipv6_list,
    XSD.String hostname optional,
    XSD.String serialNumber optional,
    XSD.String assetNumber optional,
    XSD.String description optional
  } location,
  record of record {
    XSD.String elem
  } extension_list
}
with {
  variant "name as uncapitalized";
  variant "element";
  variant (harness_list) "untagged";
  variant (harness_list[-]) "namespace as 'http://ntaforum.org/2011/harness' prefix 'h'";
  variant (documentation_list) "untagged";
  variant (documentation_list[-]) "name as 'documentation'";
  variant (documentation_list[-].lang) "attribute";
  variant (documentation_list[-].lang) "namespace as 'http://www.w3.org/XML/1998/namespace'" "prefix 'xml'";
  variant (location.ipv4_list) "untagged";
  variant (location.ipv4_list[-]) "name as 'ipv4'";
  variant (location.ipv6_list) "untagged";
  variant (location.ipv6_list[-]) "name as 'ipv6'";
  variant (extension_list) "untagged";
  variant (extension_list[-]) "name as 'extension'";
  variant (extension_list[-].elem) "anyElement";
};


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