su4sml/add-ons/uml2cdl/src/cdl.sml

979 lines
30 KiB
Standard ML

(*****************************************************************************
* uml2cdl --- a converter from UML models to WS-CDL. part of su4sml
* http://projects.brucker.ch/su4sml/
*
* cdl.sml ---
* This file is part of uml2cdl.
*
* Copyright (c) 2005-2007, ETH Zurich, Switzerland
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* * Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
******************************************************************************)
(**
* SML types corresponding to the WS-CDL xml schema.
* also includes some helper functions.
*)
structure CDL =
struct
open XML_Schema
(**
* The CDL description type.
*
*<simpleType name="tDescriptionType">
* <restriction base="string">
* <enumeration value="documentation"/>
* <enumeration value="reference"/>
* <enumeration value="semantics"/>
* </restriction>
* </simpleType>
*
*)
datatype tDescriptionType = documentation | reference | semantics
fun tDescriptionType2String documentation = "documentation"
| tDescriptionType2String reference = "reference"
| tDescriptionType2String semantics = "semantics"
fun tDescriptionTypeFromString "documentation" = documentation
| tDescriptionTypeFromString "reference" = reference
| tDescriptionTypeFromString "semantics" = semantics
| tDescriptionTypeFromString "" = documentation
(* Basically, each type below that extends tExtensibleElements *)
(* should have an additional record field: "description: {_type: tDescriptionType,
content: string }" *)
(* The content of the description is "free-form XML" *)
type tDescription = { description_type: tDescriptionType,
content: string }
(*
<simpleType name="tBoolean-expr">
<restriction base="string"/>
</simpleType>
<simpleType name="tXPath-expr">
<restriction base="string"/>
</simpleType>
*)
type tBoolean_expr = string
type tXPath_expr = string
(*
<simpleType name="tWhenType">
<restriction base="string">
<enumeration value="before"/>
<enumeration value="after"/>
<enumeration value="timeout"/>
</restriction>
</simpleType>
*)
datatype tWhenType = when_before | after | timeout
(*
<simpleType name="tUsage">
<restriction base="string">
<enumeration value="once"/>
<enumeration value="unlimited"/>
</restriction>
</simpleType>
*)
datatype tUsage = once | unlimited
fun tUsage2String once = "once"
| tUsage2String unlimited = "unlimited"
fun tUsageFromString "once" = once
| tUsageFromString "unlimited" = unlimited
(*
<simpleType name="tAction2">
<restriction base="string">
<enumeration value="request"/>
<enumeration value="respond"/>
</restriction>
</simpleType>
*)
datatype tAction2 = request | respond (* conflicts with tAction! *)
(*
<simpleType name="tAction">
<restriction base="string">
<enumeration value="request-respond"/>
<enumeration value="request"/>
<enumeration value="respond"/>
</restriction>
</simpleType>
*)
datatype tAction = request | respond | request_respond (* conflicts with tAction2 *)
fun tAction2String request = "request"
| tAction2String respond = "respond"
| tAction2String request_respond = "request-respond"
fun tActionFromString "request" = request
| tActionFromString "respond" = respond
| tActionFromString "request-respond" = request_respond
(*
<complexType name="tFinalizerReference">
<complexContent>
<extension base="cdl:tExtensibleElements">
<attribute name="choreographyName" type="NCName" use="required"/>
<attribute name="choreographyInstanceId" type="cdl:tXPath-expr"
use="optional"/>
<attribute name="finalizerName" type="NCName" use="optional"/>
</extension>
</complexContent>
</complexType>
*)
type tFinalizerReference = {choreographyName: NCName,
choreographyInstanceId: tXPath_expr option,
finalizerName: NCName}
(*
<complexType name="tVariableRef">
<complexContent>
<extension base="cdl:tExtensibleElements">
<attribute name="variable" type="cdl:tXPath-expr"
use="required"/>
</extension>
</complexContent>
</complexType>
*)
type tVariableRef = {variable: tXPath_expr}
(*
<complexType name="tSourceVariableRef">
<complexContent>
<extension base="cdl:tExtensibleElements">
<attribute name="variable" type="cdl:tXPath-expr"
use="optional"/>
<attribute name="expression" type="cdl:tXPath-expr"
use="optional"/>
</extension>
</complexContent>
</complexType>
*)
type tSourceVariableRef = {variable: tXPath_expr,
expression: tXPath_expr}
(*
<complexType name="tCopy">
<complexContent>
<extension base="cdl:tExtensibleElements">
<sequence>
<element name="source" type="cdl:tSourceVariableRef"/>
<element name="target" type="cdl:tVariableRef"/>
</sequence>
<attribute name="name" type="NCName" use="required"/>
<attribute name="causeException" type="boolean"
use="optional" default="false"/>
</extension>
</complexContent>
</complexType>
*)
type tCopy = {name: NCName,
causeException: bool option,
source: tSourceVariableRef ,
target: tVariableRef }
(*
<complexType name="tRecord">
<complexContent>
<extension base="cdl:tExtensibleElements">
<sequence>
<element name="source" type="cdl:tSourceVariableRef"/>
<element name="target" type="cdl:tVariableRef"/>
</sequence>
<attribute name="name" type="NCName" use="required"/>
<attribute name="causeException" type="boolean" use="optional" default="false"/>
<attribute name="when" type="cdl:tWhenType" use="required"/>
</extension>
</complexContent>
</complexType>
*)
type tRecord = {name: NCName,
causeException: bool option,
when: tWhenType}
(*
<complexType name="tVariableRecordRef">
<complexContent>
<extension base="cdl:tExtensibleElements">
<attribute name="variable" type="cdl:tXPath-expr"
use="optional"/>
<attribute name="recordReference" use="optional">
<simpleType>
<list itemType="NCName"/>
</simpleType>
</attribute>
<attribute name="causeException" type="boolean"
use="optional" default="false"/>
</extension>
</complexContent>
</complexType>
*)
type tVariableRecordRef = {variable: tXPath_expr option,
recordReference: NCName list,
causeException: bool option}
(*
<complexType name="tExchange">
<complexContent>
<extension base="cdl:tExtensibleElements">
<sequence>
<element name="send" type="cdl:tVariableRecordRef"/>
<element name="receive" type="cdl:tVariableRecordRef"/>
</sequence>
<attribute name="name" type="NCName" use="required"/>
<attribute name="informationType" type="QName"
use="optional"/>
<attribute name="channelType" type="QName"
use="optional"/>
<attribute name="action" type="cdl:tAction2" use="required"/>
</extension>
</complexContent>
</complexType>
*)
type tExchange = {name: NCName,
informationType: QName option,
channelType: QName option,
action: tAction,
send: tVariableRecordRef,
receive: tVariableRecordRef}
(*
</complexType>
<complexType name="tParticipate">
<complexContent>
<extension base="cdl:tExtensibleElements">
<attribute name="relationshipType" type="QName" use="required"/>
<attribute name="fromRole" type="QName" use="required"/>
<attribute name="toRole" type="QName" use="required"/>
</extension>
</complexContent>
</complexType>
*)
type tParticipate = {relationshipType: QName,
fromRole: QName,
toRole: QName}
(*
<complexType name="tTimeout">
<complexContent>
<extension base="cdl:tExtensibleElements">
<attribute name="time-to-complete" type="cdl:tXPath-expr" use="required"/>
<attribute name="fromRoleRecordReference" use="optional">
<simpleType>
<list itemType="NCName"/>
</simpleType>
</attribute>
<attribute name="toRoleRecordReference" use="optional">
<simpleType>
<list itemType="NCName"/>
</simpleType>
</attribute>
</extension>
</complexContent>
</complexType>
*)
type tTimeout = {time_to_complete: tXPath_expr,
fromRoleRecordReference: NCName list option, (* hmpf *)
toRoleRecordReference: NCName list option (* hmpf *)
}
(*
<complexType name="tBindVariable">
<complexContent>
<extension base="cdl:tExtensibleElements">
<attribute name="variable" type="cdl:tXPath-expr"
use="required"/>
<attribute name="role" type="QName" use="required"/>
</extension>
</complexContent>
</complexType>
*)
type tBindVariable = {variable: tXPath_expr,
role: QName}
(*
<complexType name="tBind">
<complexContent>
<extension base="cdl:tExtensibleElements">
<sequence>
<element name="this" type="cdl:tBindVariable"/>
<element name="free" type="cdl:tBindVariable"/>
</sequence>
<attribute name="name" type="NCName" use="required"/>
</extension>
</complexContent>
</complexType>
*)
type tBind = {name:NCName,
this: tBindVariable,
free: tBindVariable}
(*
<complexType name="tVariable">
<complexContent>
<extension base="cdl:tExtensibleElements">
<attribute name="name" type="NCName" use="required"/>
<attribute name="informationType" type="QName"
use="optional"/>
<attribute name="channelType" type="QName" use="optional"/>
<attribute name="mutable" type="boolean" use="optional"
default="true"/>
<attribute name="free" type="boolean" use="optional"
default="false"/>
<attribute name="silent" type="boolean" use="optional"
default="false"/>
<attribute name="roleTypes" use="optional">
<simpleType>
<list itemType="QName"/>
</simpleType>
</attribute>
</extension>
</complexContent>
</complexType>
*)
type tVariable = {name: NCName,
informationType: QName option,
channelType: QName option,
mutable: bool option,
free: bool option,
silent: bool option,
roleTypes: QName option}
(*
<complexType name="tRelationshipRef">
<complexContent>
<extension base="cdl:tExtensibleElements">
<attribute name="type" type="QName" use="required"/>
</extension>
</complexContent>
</complexType>
*)
type tRelationshipRef = QName
(*
<complexType name="tVariableDefinitions">
<complexContent>
<extension base="cdl:tExtensibleElements">
<sequence>
<element name="variable" type="cdl:tVariable"
maxOccurs="unbounded"/>
</sequence>
</extension>
</complexContent>
</complexType>
*)
type tVariableDefinitions = tVariable list
(*
<group name="activity">
<choice>
<element name="sequence" type="cdl:tSequence"/>
<element name="parallel" type="cdl:tParallel"/>
<element name="choice" type="cdl:tChoice"/>
<element name="workunit" type="cdl:tWorkunit"/>
<element name="interaction" type="cdl:tInteraction"/>
<element name="perform" type="cdl:tPerform"/>
<element name="assign" type="cdl:tAssign"/>
<element name="silentAction" type="cdl:tSilentAction"/>
<element name="noAction" type="cdl:tNoAction"/>
<element name="finalize" type="cdl:tFinalize"/>
</choice>
</group>
<complexType name="tSequence">
<complexContent>
<extension base="cdl:tExtensibleElements">
<sequence>
<group ref="cdl:activity" maxOccurs="unbounded"/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="tParallel">
<complexContent>
<extension base="cdl:tExtensibleElements">
<sequence>
<group ref="cdl:activity" maxOccurs="unbounded"/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="tChoice">
<complexContent>
<extension base="cdl:tExtensibleElements">
<sequence>
<group ref="cdl:activity" maxOccurs="unbounded"/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="tWorkunit">
<complexContent>
<extension base="cdl:tExtensibleElements">
<sequence>
<group ref="cdl:activity"/>
</sequence>
<attribute name="name" type="NCName" use="required"/>
<attribute name="guard" type="cdl:tBoolean-expr"
use="optional"/>
<attribute name="repeat" type="cdl:tBoolean-expr"
use="optional"/>
<attribute name="block" type="boolean"
use="optional" default="false"/>
</extension>
</complexContent>
</complexType>
<complexType name="tPerform">
<complexContent>
<extension base="cdl:tExtensibleElements">
<sequence>
<element name="bind" type="cdl:tBind"
minOccurs="0" maxOccurs="unbounded"/>
<element name="choreography" type="cdl:tChoreography"
minOccurs="0" maxOccurs="1"/>
</sequence>
<attribute name="choreographyName" type="QName" use="required"/>
<attribute name="choreographyInstanceId" type="cdl:tXPath-expr" use="optional"/>
</extension>
</complexContent>
</complexType>
<complexType name="tInteraction">
<complexContent>
<extension base="cdl:tExtensibleElements">
<sequence>
<element name="participate" type="cdl:tParticipate"/>
<element name="exchange" type="cdl:tExchange" minOccurs="0"
maxOccurs="unbounded"/>
<element name="timeout" type="cdl:tTimeout" minOccurs="0"
maxOccurs="1"/>
<element name="record" type="cdl:tRecord" minOccurs="0"
maxOccurs="unbounded"/>
</sequence>
<attribute name="name" type="NCName" use="required"/>
<attribute name="channelVariable" type="QName"
use="required"/>
<attribute name="operation" type="NCName" use="required"/>
<attribute name="align" type="boolean" use="optional"
default="false"/>
<attribute name="initiate" type="boolean"
use="optional" default="false"/>
</extension>
</complexContent>
</complexType>
<complexType name="tAssign">
<complexContent>
<extension base="cdl:tExtensibleElements">
<sequence>
<element name="copy" type="cdl:tCopy"
maxOccurs="unbounded"/>
</sequence>
<attribute name="roleType" type="QName" use="required"/>
</extension>
</complexContent>
</complexType>
<complexType name="tSilentAction">
<complexContent>
<extension base="cdl:tExtensibleElements">
<attribute name="roleType" type="QName" use="optional"/>
</extension>
</complexContent>
</complexType>
<complexType name="tNoAction">
<complexContent>
<extension base="cdl:tExtensibleElements">
<attribute name="roleType" type="QName" use="optional"/>
</extension>
</complexContent>
</complexType>
<complexType name="tFinalize">
<complexContent>
<extension base="cdl:tExtensibleElements">
<sequence>
<element name="finalizerReference" type="cdl:tFinalizerReference"
maxOccurs="unbounded"/>
</sequence>
<attribute name="name" type="NCName" use="required"/>
</extension>
</complexContent>
</complexType>
(*
<complexType name="tChoreography">
<complexContent>
<extension base="cdl:tExtensibleElements">
<sequence>
<element name="relationship" type="cdl:tRelationshipRef"
maxOccurs="unbounded"/>
<element name="variableDefinitions"
type="cdl:tVariableDefinitions" minOccurs="0"/>
<element name="choreography" type="cdl:tChoreography"
minOccurs="0" maxOccurs="unbounded"/>
<group ref="cdl:activity"/> (* what is this??? *)
<element name="exceptionBlock" type="cdl:tException"
minOccurs="0"/>
<element name="finalizerBlock" type="cdl:tFinalizer"
minOccurs="0" maxOccurs="unbounded"/>
</sequence>
<attribute name="name" type="NCName" use="required"/>
<attribute name="complete" type="cdl:tBoolean-expr"
use="optional"/>
<attribute name="isolation" type="boolean"
use="optional" default="false"/>
<attribute name="root" type="boolean" use="optional"
default="false"/>
<attribute name="coordination" type="boolean" use="optional"
default="false"/>
</extension>
</complexContent>
</complexType>
*)
(*
<complexType name="tFinalizer">
<complexContent>
<extension base="cdl:tExtensibleElements">
<sequence>
<element name="workunit" type="cdl:tWorkunit"/>
</sequence>
<attribute name="name" type="NCName" use="required"/>
</extension>
</complexContent>
</complexType>
*)
(*
<complexType name="tException">
<complexContent>
<extension base="cdl:tExtensibleElements">
<sequence>
<element name="workunit" type="cdl:tWorkunit"
maxOccurs="unbounded"/>
</sequence>
<attribute name="name" type="NCName" use="required"/>
</extension>
</complexContent>
</complexType>
*)
*)
(* mutually recursive datatypes are quite a hassle... *)
datatype tActivity = sequence of tActivity list
| parallel of tActivity list
| choice of tActivity list
| workunit of tWorkunit
| interaction of {name: NCName,
channelVariable: QName,
operation: NCName,
align: bool option,
initiate: bool option,
participate: tParticipate,
exchange: tExchange list,
timeout: tTimeout option,
record: tRecord list
}
| perform of {choreographyName: QName,
choreographyInstanceId: tXPath_expr option,
bind: tBind list,
choreography: tChoreography option}
| assign of {copy: tCopy list,
roleType: QName}
| silentAction of {roleType: QName option,
description: tDescription option}
| noAction of {roleType: QName option}
| finalize of {name: NCName,
finalizerReference: tFinalizerReference list}
and tChoreography = choreography of {name: NCName,
complete: tBoolean_expr option,
isolation: bool option,
root: bool option,
coordination: bool option,
relationship: tRelationshipRef list,
variableDefinitions: tVariableDefinitions,
choreography: tChoreography list,
activity: tActivity,
exceptionBlock: tException list,
finalizerBlock: tFinalizer list
}
and tFinalizer = tfinalizer of {name: NCName,
workunit: tWorkunit list
}
and tException = texception of {name: NCName,
workunit: tWorkunit list
}
withtype tWorkunit = {name: NCName,
guard: tBoolean_expr option,
repeat: tBoolean_expr option,
block: bool option,
activity: tActivity list}
(*
<complexType name="tTokenReference">
<complexContent>
<extension base="cdl:tExtensibleElements">
<attribute name="name" type="QName" use="required"/>
</extension>
</complexContent>
</complexType>
*)
type tTokenReference = QName (* this can probably be merged
with the type tReference... *)
(*
<complexType name="tIdentity">
<complexContent>
<extension base="cdl:tExtensibleElements">
<sequence>
<element name="token" type="cdl:tTokenReference"
minOccurs="1" maxOccurs="unbounded"/>
</sequence>
</extension>
</complexContent>
</complexType>
*)
type tIdentity = {token: tTokenReference list}
(*
<complexType name="tReference">
<complexContent>
<extension base="cdl:tExtensibleElements">
<sequence>
<element name="token" type="cdl:tTokenReference"
minOccurs="1" maxOccurs="1"/>
</sequence>
</extension>
</complexContent>
</complexType>
*)
type tReference = {token: tTokenReference}
(*
<complexType name="tPassing">
<complexContent>
<extension base="cdl:tExtensibleElements">
<attribute name="channel" type="QName" use="required"/>
<attribute name="action" type="cdl:tAction" use="optional"
default="request"/>
<attribute name="new" type="boolean" use="optional"
default="false"/>
</extension>
</complexContent>
</complexType>
*)
type tPassing = {channel: QName,
action: tAction option,
new: bool option}
(*
<complexType name="tRoleRef3">
<complexContent>
<extension base="cdl:tExtensibleElements">
<attribute name="type" type="QName" use="required"/>
<attribute name="behavior" type="NCName" use="optional"/>
</extension>
</complexContent>
</complexType>
*)
type tRoleRef3 = {ref_type: QName,
behavior: NCName option }
(*
<complexType name="tChannelType">
<complexContent>
<extension base="cdl:tExtensibleElements">
<sequence>
<element name="passing" type="cdl:tPassing" minOccurs="0"
maxOccurs="unbounded"/>
<element name="role" type="cdl:tRoleRef3"/>
<element name="reference" type="cdl:tReference"/>
<element name="identity" type="cdl:tIdentity" minOccurs="0"
maxOccurs="1"/>
</sequence>
<attribute name="name" type="NCName" use="required"/>
<attribute name="usage" type="cdl:tUsage" use="optional"
default="unlimited"/>
<attribute name="action" type="cdl:tAction" use="optional"
default="request"/>
</extension>
</complexContent>
</complexType>
*)
type tChannelType = {name: NCName,
usage: tUsage option,
action: tAction option,
passing: tPassing list,
role: tRoleRef3,
reference: tReference,
identity: tIdentity option}
(*
<complexType name="tRoleRef2">
<complexContent>
<extension base="cdl:tExtensibleElements">
<attribute name="type" type="QName" use="required"/>
</extension>
</complexContent>
</complexType>
*)
type tRoleRef2 = {ref_type: QName}
(*
<complexType name="tParticipantType">
<complexContent>
<extension base="cdl:tExtensibleElements">
<sequence>
<element name="role" type="cdl:tRoleRef2"
maxOccurs="unbounded"/>
</sequence>
<attribute name="name" type="NCName" use="required"/>
</extension>
</complexContent>
</complexType>
*)
type tParticipantType = {name: NCName,
role: tRoleRef2 list (* hmpf... *)}
(*
<complexType name="tRoleRef">
<complexContent>
<extension base="cdl:tExtensibleElements">
<attribute name="type" type="QName" use="required"/>
<attribute name="behavior" use="optional">
<simpleType>
<list itemType="NCName"/>
</simpleType>
</attribute>
</extension>
</complexContent>
</complexType>
*)
type tRoleRef = {ref_type: QName,
behavior: NCName list option (* hmpf... *)
}
(*
<complexType name="tRelationshipType">
<complexContent>
<extension base="cdl:tExtensibleElements">
<sequence>
<element name="role" type="cdl:tRoleRef" minOccurs="2"
maxOccurs="2"/>
</sequence>
<attribute name="name" type="NCName" use="required"/>
</extension>
</complexContent>
</complexType>
*)
type tRelationshipType = {name: NCName,
role: tRoleRef * tRoleRef
}
(*
<complexType name="tBehavior">
<complexContent>
<extension base="cdl:tExtensibleElements">
<attribute name="name" type="NCName" use="required"/>
<attribute name="interface" type="QName" use="optional"/>
</extension>
</complexContent>
</complexType>
*)
type tBehavior = {name: NCName,
interface: QName option
}
(*
<complexType name="tRoleType">
<complexContent>
<extension base="cdl:tExtensibleElements">
<sequence>
<element name="behavior" type="cdl:tBehavior"
maxOccurs="unbounded"/>
</sequence>
<attribute name="name" type="NCName" use="required"/>
</extension>
</complexContent>
</complexType>
*)
type tRoleType = {name: NCName,
behavior: tBehavior list
}
(*
<complexType name="tTokenLocator">
<complexContent>
<extension base="cdl:tExtensibleElements">
<attribute name="tokenName" type="QName" use="required"/>
<attribute name="informationType" type="QName"
use="required"/>
<attribute name="part" type="NCName" use="optional" />
<attribute name="query" type="cdl:tXPath-expr"
use="required"/>
</extension>
</complexContent>
</complexType>
*)
type tTokenLocator = {tokenName: QName,
informationType: QName,
part: NCName option,
query: tXPath_expr
}
(*
<complexType name="tInformationType">
<complexContent>
<extension base="cdl:tExtensibleElements">
<attribute name="name" type="NCName" use="required"/>
<attribute name="type" type="QName" use="optional"/>
<attribute name="element" type="QName" use="optional"/>
<attribute name="exceptionType" type="boolean" use="optional"
default="false" />
</extension>
</complexContent>
</complexType>
*)
type tInformationType = {name: NCName,
information_type: QName option,
element: QName option,
exceptionType: bool option
}
(*
<complexType name="tToken">
<complexContent>
<extension base="cdl:tExtensibleElements">
<attribute name="name" type="NCName" use="required"/>
<attribute name="informationType" type="QName"
use="required"/>
</extension>
</complexContent>
</complexType>
*)
type tToken = { name: NCName,
informationType: QName
}
(*
<complexType name="tPackage">
<complexContent>
<extension base="cdl:tExtensibleElements">
<sequence>
<element name="informationType" type="cdl:tInformationType"
minOccurs="0" maxOccurs="unbounded"/>
<element name="token" type="cdl:tToken" minOccurs="0"
maxOccurs="unbounded"/>
<element name="tokenLocator" type="cdl:tTokenLocator"
minOccurs="0" maxOccurs="unbounded"/>
<element name="roleType" type="cdl:tRoleType" minOccurs="0"
maxOccurs="unbounded"/>
<element name="relationshipType" type="cdl:tRelationshipType"
minOccurs="0" maxOccurs="unbounded"/>
<element name="participantType" type="cdl:tParticipantType"
minOccurs="0" maxOccurs="unbounded"/>
<element name="channelType" type="cdl:tChannelType"
minOccurs="0" maxOccurs="unbounded"/>
<element name="choreography" type="cdl:tChoreography"
minOccurs="0" maxOccurs="unbounded"/>
</sequence>
<attribute name="name" type="NCName" use="required"/>
<attribute name="author" type="string" use="optional"/>
<attribute name="version" type="string" use="optional"/>
<attribute name="targetNamespace" type="anyURI"
use="required"/>
</extension>
</complexContent>
</complexType> *)
type tPackage = {name: NCName,
author: string,
version: string,
targetNamespace: anyURI,
schema: xsdSchema,
informationType: tInformationType list,
token: tToken list,
tokenLocator: tTokenLocator list,
roleType: tRoleType list,
relationshipType: tRelationshipType list,
participantType: tParticipantType list,
channelType: tChannelType list,
choreography: tChoreography list
}
end